pointers - 指向参数数组目标的 Fortran 指针

标签 pointers parameters fortran gfortran target

我在模块中有一些具有不同名称的参数数组:

real*8, parameter :: para1(*) = [43.234, 34.0498, ...
real*8, parameter :: para2...

在此模块的例程中

subroutine sub(n,...
...
end

我想在n=1时使用para1,在n=2时使用para2,等等。有一些解决方案,其中之一是创建一个数组 paras=[para1,para2...] 并正确索引,效果很好。但我想尝试使用指针

real*8, pointer :: ptr(:) 

并根据n将其分配给不同的参数数组,但问题是“PARAMETER属性与(1)处的TARGET属性冲突”。如果我删除 parameter 属性,则例程的安全性会降低,并且会假定使用 SAVE 属性。

我是否遗漏了什么,或者为什么我们不能将参数目标结合起来?为此目的有什么好的方法吗?

最佳答案

parametertarget 属性确实存在冲突。具有 target 属性的对象必须是变量(Fortran 2018 8.5.17,C861);命名常量(具有 parameter 属性的对象)不是变量(F2018、8.5.13、C850)。

要使用目标数组,您必须使用变量。拥有一个“安全”的变量,使其值不会因编程错误等而被修改是很棘手的。有几个考虑因素禁止变量出现在变量定义上下文中。如果你能安排这样的状态,那么编译器可能有机会检测到你的错误。这很容易发生吗?

除了纯过程和 intent(in) 虚拟参数之外,最诱人的禁止是使用 protected 模块变量:

module pars
  real, save, target, protected :: para1(74) = [...]
  real, save, target, protected :: para2(1) = [6]
end module

subroutine sub (...)
  use pars
  real, pointer :: p
  p => para1
end subroutine sub

受到保护,这些值可以安全地免受模块 pars 外部的修改吗?唉,即使这是真的,也没有什么帮助:受到保护,我们甚至无法指向模块变量的指针。

总之,您的编译器不会轻易检测到修改变量目标数组的编程错误,因此如果您想使用数组作为目标,则必须小心。

关于pointers - 指向参数数组目标的 Fortran 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56462731/

相关文章:

sql - 根据参数的条件WHERE

C++构造函数默认参数

python - 如何获取有关使用 f2py 构建的 Python 模块的运行时错误的信息

C++:在不知道函数名的情况下获取当前函数指针?

c++ - 类和指针,它们是如何工作的?

c - 从函数返回数组/指针

matrix - 如何从 QR 分解输出中获取 Q?

c - 递增指针并分配一个新值 - 堆栈损坏

view - Eclipse RCP : org. eclipse.ui.views.showView 参数

C_F_POINTER 导致未定义的数组