2017-10-11 76 views
2

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

program arrayProg 

    integer :: matrix(3,3), i , j !two dimensional real array 

    matrix = reshape((/1:9:1/), (/3,3/)) 

end program arrayProg 

这个语法在fortran中可以接受吗? (它必须是因为它来自遗留代码) 我是否误解了该行的功能?

+0

编译器发现了什么样的错误?哪个编译器?请看[ask]和[mcve],你应该总是提供你所有的信息。错误的消息我们非常重要。语法不正确。 –

回答

4

语法不正确,并且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 

https://software.intel.com/en-us/node/678554

要生成一个标准的方式序列中的一个使用一个隐含的DO循环像

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

的重塑不仅仅是改变按照您猜测的主要顺序,将一维数组转换为二维数组。

+3

顺便说一句,每当有人推荐在新代码中使用一些非标准的扩展,尤其是像DEC扩展那样的丑陋的东西时,请考虑一下这样的情况。有人会继承这些代码,会得到一些不同的编译器,并且会被搞砸或至少让人困惑,并且PIA会将代码重写为标准格式。你不能说“它是可移植的,因为我总是使用英特尔,这是无稽之谈。” –

+0

同意,但在这种情况下,现代Fortran具有完全可用的整数序列生成语法,只能在数组索引上使用,这实在令人恼火。尝试使用这种方法创建整数序列是很自然的,只是发现一个被迫使用隐含DO循环来保持语言标准(翻译:我被这个咬了。)这就是为什么我建议编码即使你不打算使用结果,也可以使用多个编译器;您会收到非标准扩展的快速通知。 – arclight