9

如何访问从函数返回的数组元素?例如,shape()返回一个整数数组。如何将该数组的元素与整数进行比较?以下不编译:

integer :: a
integer, dimension(5) :: b

a = 5
if (a .eq. shape(b)) then
    print *, 'equal'
end if

错误是:

if (a .eq. shape(c)) then
    1
Error: IF clause at (1) requires a scalar LOGICAL expression

我知道这是因为shape(c)返回一个数组。但是,访问数组的元素似乎不可能像这样:shape(c)(1)

现在,如果我添加这两行:

integer, dimension(1) :: c
c = shape(b)

...并将if子句更改为:

if (a .eq. c(1)) then

...然后它的工作原理。但是我真的必须声明一个额外的数组变量来保存 的返回值shape(),还是有其他方法可以做到这一点?

4

4 回答 4

14

除了处理 SHAPE 和逻辑表达式等的答案之外,您的问题的一般答案是“如何访问从函数返回的数组元素?” 是

  • 您将具有函数引用的表达式分配给数组变量,然后索引该数组变量。

  • 您使用具有函数引用的表达式作为过程的实际参数,该过程采用虚拟数组参数,并为您进行索引。

因此,您最后一个问题的一般答案“但是我真的必须声明一个额外的数组变量来保存 shape() 的返回值,还是有其他方法可以做到这一点?” 是“是的,您确实需要声明另一个数组变量”,因此“不,没有其他方法”。

(请注意,一旦获得数组函数的结果,合理的优化编译器将避免任何额外的内存操作/分配等,这实际上只是一个语法问题。)

语言设计的这一特定方面的基本原理有时归因于需要避免字符类型的数组函数结果的语法歧义和混淆(它们可能被索引和/或子字符串 - 你怎么知道是什么意思?) . 其他人认为这样做只是为了惹恼 C 程序员。

于 2013-07-24T23:03:17.220 回答
7

而不是使用shape(array),我会使用size(array)

请注意,这将返回一个整数,指示所有维度中有多少元素,除非您指定DIM属性,在这种情况下,它将仅返回指定维度中的元素数。

查看 gfortran 文档:

http://gcc.gnu.org/onlinedocs/gfortran/SIZE.html

另外,抬头看lboundubound

于 2013-07-24T22:25:57.007 回答
2

注意表达式

a == shape(b) 

返回一个 rank-1 逻辑数组,并且该if语句要求条件归约为标量逻辑表达式。您可以将 rank-1 数组减少为这样的标量:

if (all(a == shape(b)))

这当然不是将数组索引应用于数组返回函数(例如shape(b)(1).

于 2013-07-24T20:51:21.840 回答
1

即使没有中间变量,也可以使用ASSOCIATE

 real c(3,3)
 associate (x=>shape(c))
   print *,x(1),x(2)
 end associate
end
于 2013-08-05T11:09:24.327 回答