Author Topic: problem with variables used for a FOR loop not being stored correctly  (Read 3127 times)

Offline Gary

  • Dr. Type
  • ****
  • Posts: 313
    • View Profile
I have found what I think is an issue with passing a variable to a subroutine.  Example code

Code: GLBasic [Select]
GLOBAL i

FOR i = 0 TO 10
        GOSUB printi
NEXT

END

SUB printi:
        DEBUG i+"\r\n"
ENDSUB
 

I would expect the output to be
0
1
2
3
4
5
6
7
8
9
10

but instead I get
0
0
0
0
0
0
0
0
0
0
0

if I make a copy of the variable used in the for loop it passes to the routine correctly.

It almost looks like a variable used in a for loop is not the same variable as the globally defined one. See the code below for a better explanation

Code: GLBasic [Select]
GLOBAL i=100

FOR i = 0 TO 10
        GOSUB printi
NEXT

END

SUB printi:
        DEBUG i+"\r\n"
        i=i+1
ENDSUB
 

this will display
100
101
102
103
104
105
106
107
108
109
110

in the debug window

Using a function also does the same thing

Gary
« Last Edit: 2012-Jun-22 by Gary »

Offline Crivens

  • Prof. Inline
  • *****
  • Posts: 913
    • View Profile
I've had similar things in the past where I found assigning the for variable to another variable and using that variable instead seemed to work. Don't know why and I can't remember if I reported it at the time to be honest

Cheers
Current fave quote: Cause you like musicians and I like people with boobs.

Offline Gary

  • Dr. Type
  • ****
  • Posts: 313
    • View Profile
just ran another test and found its not related to subroutines

Code: GLBasic [Select]
GLOBAL i=100

FOR i = 0 TO 10
NEXT
        DEBUG i+"\r\n"
END
 

will output i being = 100 (the default value) after the for loop is run when it should be 10

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10714
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
With option implicit, the for loop will generate a local variable in the loop scope. With explicit the i global should be used.

Offline Gary

  • Dr. Type
  • ****
  • Posts: 313
    • View Profile
explicit is set in the build options, toggling it off makes no difference.

Or is there another setting elsewhere that sets it?
« Last Edit: 2012-Jun-22 by Gary »

Offline kanonet

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1142
    • View Profile
    • My GLBasic code archiv
Even when Gernot said it different, im sure FOR always defines a new, local variable, which is why you dont need to define it. If you already have a global with the same name, than the loop uses the local, but your sub the global of cause (since there is no local with than name defined there, but even if it where, it would be a local - not the same local like in the loop). If you want to use your For-variable (in this case the i), just give it as a parameter to you sub.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

MrTAToad

  • Guest
It will always print a value from 100 - the i% in the FOR loop is defined as local, and will not display the value for that variable in the subroutine.  Changing to and from explicit declaration doesn't make a difference.

This is the correct way of how variable work, I believe - it does show a limitation of subroutines over functions :)

Offline Hemlos

  • To boldy go where no pixel has gone before!
  • Global Moderator
  • Prof. Inline
  • *******
  • Posts: 1635
  • Particle Hawk
    • View Profile
i found a bug with ide and for, and inline
if you edit an inline with a 'for' in the code:

inline
for(i blah blah)
endinline

if you edit the inline and move something, sometimes it turns into this FOR

inline
FOR()
endline

This will give alot of bad errors in the precompiler, with no pointer to the problem.
I problem and actively check for this myself by eye, and i dont think its a critical problem, personally.
Volume_of_Earth(km^3) = 4/3*3.14*POW(6371.392896,3)

MrTAToad

  • Guest
Yes, that can be annoying :)  It's where the IDE isn't checking to see whether the command is inside an INLINE block or not...

Another annoyance is where variables (or even functions) are converted to the layout of another variable or function of the same name...

 For example I have a function called Setup, and a variable called setup.  Unfortunately "setup" gets converted to "Setup"
« Last Edit: 2012-Jun-23 by MrTAToad »