这两种声明假定大小数组的方法之间有什么区别吗?
e.g。
real, dimension(:) :: arr
和
real :: arr(*)
答案 0 :(得分:39)
表格
real, dimension(:) :: arr
声明假定形状的数组,而形式为
real :: arr(*)
声明假定大小数组。
而且,是的,它们的使用存在差异。差异的产生是因为,编译器大致知道'假定形状数组的形状,但不是假定大小数组的形状。编译器可用的额外信息意味着,假设形状数组可以在整个数组表达式中使用。假定大小数组只能在整个数组表达式中使用,因为它是过程引用中不需要数组形状的实际参数。哦,也是对内在lbound
的调用 - 但不是对内在ubound
的调用。还有其他微妙的,不那么微妙的差异,你仔细阅读标准或好的Fortran书将会揭示。
对于新Fortran程序员的一些建议是尽可能使用假定形状的数组。它们在Fortran 90之前不可用,因此您将在旧代码中看到许多假定大小的数组。假设形状数组在新代码中更好,因为shape
和size
函数可用于查询其大小以避免越界错误,并可用于allocate
数组,其维度取决于关于输入数组的维度。
答案 1 :(得分:14)
High Performance Mark's answer解释了两个陈述之间的区别 - 简而言之:是的,有差别;只有一个声明一个假定大小的数组 - 以及含义。
但是,正如dimension(:)
提到的那样,似乎不是dimension(*)
,我会添加一件事。
real, dimension(:) :: arr1
real, dimension(*) :: arr2
相当于
real :: arr1(:)
real :: arr2(*)
甚至使用dimension
语句。 [我不想鼓励这样做,所以我不会写出这个例子。]
问题的重要区别在于使用*
和:
,而不是dimension
。
也许假设大小与伪参数有一些混淆?这是一个虚拟的论据,这种选择最常见。