我在模块中有一些具有不同名称的参数数组:
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
属性。
我是否遗漏了什么,或者为什么我们不能将参数
和目标
结合起来?为此目的有什么好的方法吗?
最佳答案
parameter
和 target
属性确实存在冲突。具有 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/