Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Fortran中返回数组的访问元素_Arrays_Fortran_Element - Fatal编程技术网

Arrays Fortran中返回数组的访问元素

Arrays Fortran中返回数组的访问元素,arrays,fortran,element,Arrays,Fortran,Element,如何访问从函数返回的数组元素?例如,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 e

如何访问从函数返回的数组元素?例如,
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()
的返回值,还是有其他方法来实现它呢?

请注意

a == shape(b) 
返回逻辑的秩1数组,并且
if
语句要求条件简化为标量逻辑表达式。您可以将秩1数组减少为如下所示的标量:

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

这当然不是对数组返回函数(如
shape(b)(1)

的语法无效的数组索引应用的一般替代,我将使用
size(array)
,而不是使用
shape(array)

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

请查看gfortran文档:


此外,请查看
lbound
ubound

关于形状和逻辑表达式等的答案,您的问题“如何访问从函数返回的数组元素?”的一般答案如下:

  • 将具有函数引用的表达式指定给数组变量,然后为该数组变量编制索引

  • 使用具有函数引用的表达式作为接受伪数组参数的过程的实际参数,并为您创建索引

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

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


语言设计的这一特定方面的基本原理有时被归因于需要避免字符类型的数组函数结果的语法歧义和混淆(它们可能被索引和/或子字符串化-如何判断意图?)。其他人认为这样做只是为了激怒C程序员

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

 real c(3,3)
 associate (x=>shape(c))
   print *,x(1),x(2)
 end associate
end

如果数组总是从1开始,则可以使用ubound(b,1)。
size
ubound
在我提供
dim
参数时,这两个参数对我来说都非常有效。谢谢你的建议!这确实回答了关于Fortran风格的真正问题,所以我接受这个作为答案。然而,@SuperCow和@cup都通过推荐指定了
dim
属性的
size
ubound
解决了我的短期问题。谢谢大家!