local variables do not release on time

local variables do not release on time

One section of my program is a module with many subroutines. In each subroutine there the same integer variables like 'i,j,k,m'. These variables are used to control the loops in each subroutine,such as ‘do i=1,10’; or used to save some temporary values.  I am sure that there are no 'common' or 'save' in my program. But when the program runing from one subroutine to another, these variable can not be changed. For example, I change k as 'k=1', it is still the former value. So i delete these variables in the subroutines and directly declare them in the module. Then, it worked well. I know the variables in subtoutine are local variables. why i can not  change them? 

fortran
13 posts / 0 new
Last post
For more complete information about compiler optimizations, see our Optimization Notice.

Quote:

For example, I change k as 'k=1', it is still the former value.

How did you check this? If you used a symbolic debugger to do so, note that if you have optimization enabled some variables may be handled entirely in registers, or the value in memory and the value in a register may not be synchronized.

Quote:

mecej4 wrote:

Quote:

For example, I change k as 'k=1', it is still the former value.

How did you check this? If you used a symbolic debugger to do so, note that if you have optimization enabled some variables may be handled entirely in registers, or the value in memory and the value in a register may not be synchronized.

 I just debug the program in VS2010 and use the watch window to monitor their values. Sometimes it can not be changed. For a short programm, it will always work well. But for a long one, this mistake will happen occassionally.

fortran

Quote:

mecej4 wrote:

Quote:

For example, I change k as 'k=1', it is still the former value.

How did you check this? If you used a symbolic debugger to do so, note that if you have optimization enabled some variables may be handled entirely in registers, or the value in memory and the value in a register may not be synchronized.

 I just debug the program in VS2010 and use the watch window to monitor their values. Sometimes it can not be changed. For a short programm, it will always work well. But for a long one, this mistake will happen occassionally.

fortran

Can we see a complete code example showing the problem please

Quote:

Andrew Smith wrote:

Can we see a complete code example showing the problem please

the program is for numerical simulation and it too long. it also need the data file to run smoothly. I use another complier to debug the program, the mistake disappeared. So maybe i did not install the complier properly.

fortran

Fortran doesn't permit changing a loop control variable inside the loop.  Ideally, the compiler gives you a diagnosis when you attempt to violate the rule.  If you succeed in changing it without being caught, the program behavior is undefined.

As others hinted, it would be important to give an example to clarify your meaning.

Quote:

TimP (Intel) wrote:

Fortran doesn't permit changing a loop control variable inside the loop.  Ideally, the compiler gives you a diagnosis when you attempt to violate the rule.  If you succeed in changing it without being caught, the program behavior is undefined.

As others hinted, it would be important to give an example to clarify your meaning.

i did not change the a loop control variable inside the loop.  i just mean it did not increase an it will be. 

fortran

integer :: i
i = 1 ! ok outside of loop using i as loop control variable
DO i=1,N
i = i + 2 ! Not valid to do this inside loop, either with debugger or by code
...
END DO

Note, if any compiler optimizations occure, then the variable i may have a location (stack variable) when the code is outside the loop, and may reside inside a register when inside the loop. Under conditions when the loop control variable is in a register, the debugger may not permit you to alter its value (which is invalid for you to do so whether i is located in a register or not). Depending on debugger and compiler version, it may indicate that i is inside a register.

Jim Dempsey

www.quickthreadprogramming.com

module aaa                                                                                                                                                                                                                     subroutine b1                                                                                                                                                                                                                  integer i,j,k                                                                                                                                                                                                        do i=1,30...                                                                                                                                                                                                    end subroutine                                                                                                                                                                                                                     subroutine b2                                                                                                                                                                                                                  integer i,j,k                                                                                                                                                                                                        do i=1,30...                                                                                                                                                                                                    end subroutine                                                                                                                                                                                                                     subroutine b3                                                                                                                                                                                                                  integer i,j,k                                                                                                                                                                                                        do i=1,30...                                                                                                                                                                                                    end subroutine                                                                                                                                                                                                                  end module                                                                                                                                                                                                               

When i called subroutine b1,everything is ok, but when i called b2, the value of 'i' is still the previous value obtained when return form b1.  Even if i use 'i=1', the value of 'i' still can not be changed.

fortran

Insert a

WRITE(*,*) i

After each DO in each DO loop and see what comes out.

If you compile with any optimizations enabled then i may be registerized.
Also, if i is not used in the loop or elsewhere outside the loop, then a no optimization might concievably remove i since it wouldnever be referenced (FORTRAN DO loops compute an iteration count as opposed to performing a limit test using the loop control variable).

Jim Dempsey

www.quickthreadprogramming.com

I dont think anyone can understand your issue without posting meaningful code. Your code does not have any assignments such as was your stated problem and none of the subroutines are called.

Thank you for your insightful comments. Maybe the code is too simple to find out the ture reason,and i have solved this porblem by changing the version of my complier. So if i come acorss the problem again, i will give a more detail codes. Thank you very much.

fortran

Login to leave a comment.