将MINLOC与Fortran一起使用:在分配中不兼容的等级0和1

时间:2013-12-18 22:43:07

标签: arrays fortran

提供错误消息的版本

program hello
   integer a(9)
   integer index; ! note no dimension here
   a=(/1, 3, 4, 5, 6, 7, 8, 9, 10/)
   index = MINLOC(a, MASK=(a > 5))
   Print *, index
end program Hello

错误消息

main.f95:5.3:

index = MINLOC(a,MASK =(a> 5))    1 错误:在(1)

的赋值中,排名0和1不兼容

工作版

program hello
   integer a(9)
   integer index(1) ! note dimension 1 here which looks redundant at first
   a=(/1, 3, 4, 5, 6, 7, 8, 9, 10/)
   index = MINLOC(a, MASK=(a > 5))
   Print *, index
end program Hello

搜索

Here我可以找到相关的讨论,但我觉得它不足以让我理解其中的差异。

2 个答案:

答案 0 :(得分:6)

您可以使用minloc参数修复第一个版本,从DIM获取标量返回值:

index = MINLOC(a, DIM=1, MASK=(a > 5))

P.S。除非每行放置多个语句,否则不需要分号来结束语句。 Fortran不是C.

答案 1 :(得分:1)

This discussion提出了一个重点:MINLOC返回一个数组,即使它只是一个数字,它仍然是一个数组。

可以将index声明为数组,如上所述,或者使用临时数组。

integer :: temp(1)
...
temp=minloc(dist)
index=temp(1)

也可以使用DIM参数来避免手动摆弄数据类型,如M.S.B的答案所述。