【问题标题】:Using MINLOC with Fortran: Incompatible ranks 0 and 1 in assignment将 MINLOC 与 Fortran 一起使用:分配中不兼容的 0 和 1 等级
【发布时间】:2013-12-18 22:43:06
【问题描述】:

给出错误消息的版本

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:

索引 = 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我可以找到相关的讨论,但我觉得它不够冗长,无法让我理解其中的区别。

【问题讨论】:

    标签: arrays fortran


    【解决方案1】:

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

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

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

    【讨论】:

    • 删除分号;它们是在尝试解决另一条错误消息时意外添加的...
    • 通过了这个答案,非常艰难。干杯,
    【解决方案2】:

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

    可以像上面提到的那样将索引声明为一个数组,或者使用一个临时数组。

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

    也可以使用 DIM 参数来避免手动摆弄数据类型,就像 M.S.B 的回答中提到的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 2023-04-10
      相关资源
      最近更新 更多