我刚刚开始在Fortran中使用指针,最近偶然发现,Fortran中的指针不能保持不变。这意味着,这样的事情是不可能的:
procedure(proc_type), pointer, parameter :: fPtr => myFunc
我试图找出为什么这是不可能的原因。但我发现的唯一一件事就是“现代Fortran解释”:
另请注意,常量可能不是指针[..],因为它们是 总是变量。
但这并不能解释背后的原因。有谁知道这个?
答案 0 :(得分:5)
因为Fortran规则是这样说的
Fortran 2008(ISO / IEC 1539-1:2010):
5.3.14 POINTER属性
1具有POINTER属性的实体可以在执行期间与不同的数据对象或过程相关联 一个程序。指针是数据指针或过程 指针。过程指针在中描述 12.4.3.6。
这与常量不兼容。
为什么规则如此?因为该标准的作者就是这样做的。
为什么他们这样做?对此的答案通常非常简单 - 因为没有人提出不同的规则需要委员会讨论和批准,或者委员会的一些成员不喜欢它。你真的要问他们 - J3和SC22/WG5,但要准备好答案,没有具体的理由。
在某些属于同一类别的语言中,例如C和C ++,常量指针是可能的。初始化为常量指针的常量指针
const int i = 3;
static int* const x=(int*)&i;
初始化的常量指针指向整数函数
int fun(){
return 1;
}
static int (* const x)()=&fun;
绝对有可能在Fortran中允许这样的东西。请联系Fortran标准委员会的代表,以建议这样的功能。
如IanH和credondo所示,有一些方法可以绕过这种限制,但是这个答案试图让我保持原始问题的界限。 为什么存在这种限制?
答案 1 :(得分:1)
如果指针是在具有PROTECTED
属性的模块中声明的,则指针在该模块之外变为常量(EDIT :)
module mod1
implicit none
procedure() :: p_target
procedure(), pointer :: ptr => null()
procedure(), pointer, protected :: ptr_protected => null()
end module mod1
program pointer_parameter
USE mod1
implicit none
ptr => p_target
ptr_protected => p_target
end program
编译器返回以下错误
gfortran -c pointer_parameter.f90
pointer_parameter.f90:6.3:
ptr_protected => p_target
1
Error: Variable 'ptr_protected' is PROTECTED and can not appear in a pointer
association context (pointer assignment) at (1)
答案 2 :(得分:1)
这取决于"常量指针"的含义。
如果您指的是在程序执行期间无法更改其关联状态的指针对象,那么您的前提是错误的......您可以声明并初始化在程序执行期间无法更改其关联状态的指针对象。
TYPE :: t
PROCEDURE(xyz), POINTER :: fPtr
END TYPE t
TYPE(t), PARAMETER :: this_a_constant = t(myFunc)
类似的东西可用于数据对象。您可以使用组件的默认初始化来实现类似的结果。
如果指向数据对象的指针是指一个指向常量的对象,那么直接的解释是Fortran中的命名常量(和文字常量)代表值,值不能是目标而你只能将指针与目标相关联。在这个直接解释的背后是实现视角,该值实际上可能不需要在运行时存在,因此不能为它留出任何存储,因此实现方面没有什么可指向的。在将来我想你可以改变围绕这个的语言规则,这样命名常量也可以有目标属性,但是如果没有在其他地方产生问题,这种变化的规范可能很难做到。
这两个方面的一个共同点是,指针在隔离中的关联状态不是指向的东西的值的一部分,但是对象的指针组件的指针关联状态是值的一部分。那个对象。