【问题标题】:Get value at some memory address in Fortran在 Fortran 中的某个内存地址获取值
【发布时间】:2020-03-14 10:12:20
【问题描述】:

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

我知道我可以使用 LOC(BVAR) 获得 BVAR 内存地址,并且我想知道在 SUBB 中此地址的值何时更改。由于 SUBB 中调用了很多变量和许多其他子程序,因此查询 SUBB 中所有变量的内存地址是不切实际的。

谢谢

【问题讨论】:

  • 我正在使用 Intel 2011 和 Visual Studio 2010
  • 既然您似乎要求调试目的,您是否尝试过进行调试构建、设置断点并检查正在发生的事情?调试器让您可以跨多个子例程查询多个变量。

标签: pointers memory fortran


【解决方案1】:

感谢您的回答

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

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

【讨论】:

    【解决方案2】:

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

    但要回答您的问题:您可以尝试使用一些技巧从您想要的任何地址读取。如果地址无效并且程序崩溃或行为异常,则由您负责。

    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
    

    【讨论】:

      猜你喜欢
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      相关资源
      最近更新 更多