现代Fortran中声明一个数组而不给出它的长度并让编译器从声明中确定长度的语法是什么?
以下示例不有效:
program ONE
real :: V = [1,2,3]
end program
program ONE
real :: V(*) = [1,2,3]
end program
但是这个例子确实有效:
program ONE
real :: V(3) = [1,2,3]
end program
为什么编译器不能从声明中计算所需的长度?有没有办法做到这一点?
答案 0 :(得分:5)
您可以执行以下操作,这需要两行,一个声明和一个可执行语句:
program ONE
real, dimension (:), allocatable :: V
V = [1,2,3]
end program
这使得Fortran 2003在分配时重新分配的功能。
答案 1 :(得分:2)
正如其他人所说,你想要做的事情目前在Fortran中不可能带有变量。但是,我要注意,Fortran 2008为使用parameter
属性声明的命名常量添加了这样做的可能性。这称为“隐含形状数组”,如下所示:
program ONE
real, parameter :: V(*) = [1,2,3]
end program
也可以为数组指定下限:
program TWO
real, parameter :: V(2:*) = [1,2,3]
end program
尽管我还没有听说过任何Fortran 2008编译器,但许多编译器可能已经实现了这一点,因为它似乎并不太难。
也许,如果对当前标准的更新在几年后发布,这对于变量也是可能的,尽管可以想象它会立即完成,同时命名常量,如果这很容易。
答案 2 :(得分:1)
我从来没有遇到过你似乎想要的东西,当然不是你所提供的例子。但是(但你可能很清楚这一点),如果你看一下子程序和函数(即你的数组变成一个伪参数),情况会有所不同,因为你可以使用假定形状的数组,如
subroutine ONE (V)
real :: V(:)
end subroutine ONE
在上面的例子中,子程序的V
将具有与传递给ONE
的数组相同数量的元素。但是,在子例程之外,您必须使用所需数量的元素声明V
(或使其可分配,并且只有在知道它应该具有多少元素时才分配它。)
我希望这会有所帮助。
答案 3 :(得分:0)
不,你必须以某种方式宣布它。明确地或(让我们说)隐含地,但你必须声明它。
您正在寻找的更多是动态语言的特征。
您可以拥有可分配的数组,这些数组的大小在编译时是未知的,但是在为其赋值时,您不能拥有其大小未知的数组。