Pointers 获取Fortran中某个内存地址的值

Pointers 获取Fortran中某个内存地址的值,pointers,memory,fortran,loc,Pointers,Memory,Fortran,Loc,在子程序SUBA中有一个布尔变量BVAR,当我从SUBA调用子程序SUBB时,它会发生变化。BVAR并没有作为参数传递给SUBB,数组声明可能出现了一些问题,我不知道如何找到它 我知道我可以用LOCBVAR获得BVAR内存地址,我想知道在SUBB中该地址的值何时更改。由于SUBB中调用了许多变量和许多其他子例程,因此请求SUBB中所有变量的内存地址是不切实际的 谢谢首先,我应该指出,这可能不是解决程序原始问题的正确方法。相反,您应该启用所有编译器检查并使用调试器。在这个网站上可以看到许多类似的问

在子程序SUBA中有一个布尔变量BVAR,当我从SUBA调用子程序SUBB时,它会发生变化。BVAR并没有作为参数传递给SUBB,数组声明可能出现了一些问题,我不知道如何找到它

我知道我可以用LOCBVAR获得BVAR内存地址,我想知道在SUBB中该地址的值何时更改。由于SUBB中调用了许多变量和许多其他子例程,因此请求SUBB中所有变量的内存地址是不切实际的


谢谢

首先,我应该指出,这可能不是解决程序原始问题的正确方法。相反,您应该启用所有编译器检查并使用调试器。在这个网站上可以看到许多类似的问题

但要回答你的问题:你可以通过一些技巧尝试阅读任何你想要的地址。如果地址无效,程序崩溃或行为异常,这是您的责任

use iso_c_binding

type(c_ptr) :: p
integer(c_intptr_t) :: i8

real, pointer :: fp !(or any other type)

!!if you have BVAR available
!p = c_loc(BVAR)
!or
!p = transfer(loc(BVAR), p)

!from any numeric address
i8 = 1564234_c_intptr_t   

p = transfer(i8, p)

call c_f_pointer(p, fp)

print *,fp

谢谢你的回答

编译器诊断可能是个好主意,但由于代码的某些部分使用了非常旧的约定,我已经遇到了一些问题

实际上,我通过运行内部子例程的一部分并跳过其余的Ctrl+Shift+F10来解决这个问题,以查看外部变量中的更改是由什么引起的。
我找到了这行代码,发现有一个变量作为参数传递,在2个子例程中声明不同,然后使用另一个变量的内存。

我使用的是Intel 2011和Visual Studio 2010,因为您似乎在要求进行调试,您是否尝试过进行调试生成,设置断点并检查发生了什么?调试器允许您跨多个子例程查询多个变量。