在 Fortran 中使用序列启动数组



我目前正在翻译一些遗留的 fortran 代码,我很难理解代码中的特定行。编译器似乎也发现这一行很奇怪,并抛出了一个错误。据我了解,它试图通过将 1 到 9 以 1 为增量进行排序来初始化数组,并以列主要形式用该序列填充数组矩阵。

program arrayProg
  integer :: matrix(3,3), i , j !two dimensional real array
  matrix = reshape((/1:9:1/), (/3,3/))
end program arrayProg

这种语法在 fortran 中可以接受吗?(一定是因为它来自遗留代码)我误解了这条线的作用吗?

语法不正确,Fortran 编译器无法编译此类代码,除非它实现了某些非标准扩展。

英特尔 Fortran 接受这一点:

 A colon-separated triplet (instead of an implied-DO loop) to specify a range of values and a stride; for example, the following two array constructors are equivalent:
1       INTEGER D(3)
2       D = (/1:5:2/)              ! Triplet form - also [1:5:2]
3       D = (/(I, I=1, 5, 2)/)     ! implied-DO loop form

来自开发参考指南:数组构造函数

(注意:英特尔文档的链接经常更改,如果链接已失效,请在评论中通知我并尝试搜索"三元组形式"和"数组构造函数")

要以标准方式生成序列,请使用隐含的 do 循环,例如

 (/ (i, i=1,9) /)

然后,重塑只是按照您猜测的列主要顺序将 1D 数组更改为 2D 数组。

最新更新