我对FORTRAN非常陌生,所以这可能是一个非常简单的问题,但我在网上搜索它后我不确定...
基本上我认为我有一个input.txt文件,其大小为2D数组
e.g。 input.txt文件包含
4 5
因此,在打开文件并在变量行和 col 上注册4和5之后,我执行以下操作...
由于FORTRAN77具有您必须在语句之前声明的特定格式,因此我考虑使用 SUBROUTINE
这是SUBROUTINE的想法
SUBROUTINE create(row,col)
INTEGER array(row,col)
RETURN
END
我不确定代码是否能够运行,因为它在声明后没有语句,但我已经收到错误说
第x行出错:数组的声明错误:非参数
上的可调维度
我不确定是什么问题,所以我来到这个
欢迎提供示例代码和链接,但总结我应该知道的内容会很棒!
另外,FORTRAN77将用于编译我的代码,所以我必须坚持FORTRAN77风格
答案 0 :(得分:3)
这至少是Fortran 95的问题,而不是77.这是2014年!!!
您需要将数组声明为allocatable
并使用
allocate(array(rows, cols))
从文件中读取cols
和rows
后。
这样你就不必使用子程序,但是如果程序逻辑结构支持它的话。
答案 1 :(得分:3)
您似乎需要一个allocatable数组,该数组在FORTRAN77中无效。但是,由于它现在是2014年,自1977年以来已有4次更新(1990年,1995年,2003年和2008年,加上目前正在进行的2015年更新会议),您可以自由地避开FORTRAN77。
您想要做的是以下内容:
program array_builder
integer, allocatable :: block(:,:)
integer :: row, col
read(*,*) row, col
allocate(block(row, col))
<whatever you need to do>
deallocate(block)
end program array_builder
作为一个黑客攻击,可以尝试的一个选项如下:
row
和col
array(1:row,1:col)
这样可以这样工作
program pre_define_array
integer, dimension(50,50) block
integer row, col
read(*,*) row, col
block = 0
call do_stuff(block(1:row,1:col), row, col)
end program pre_define_array
subroutine do_stuff(in_array, rows, cols)
integer rows, cols
integer, dimension(rows, cols) in_array
<do math here>
end subroutine do_stuff
答案 2 :(得分:1)
拥有约束“FORTRAN 77”使得这个问题听起来像是Code Golf上的问题:请参阅Kyle Kanos的回答和“每次重新编译”的建议。
在FORTRAN 77下,数组在编译时的大小是固定的。子程序可以采用可变大小的参数,但是因为数组的内存仍然需要在某处分配,所以不能使用它来解决约束(作为问题尝试中的子例程示例)。那么,根据F77,你不可能做你想做的事。
作为历史课,但是当重新编译不好时,我将为这个问题提供一个共同的F77主义。如果你能说服人们你真的不能使用到目前为止给出的非常有效的解决方案,那么可能有可能扩展这个解释。
声明一个足够大的数组来解决你最大的问题,然后做大量的记账,传递问题大小(实际使用的内存子集)等。如果你想看到历史上那段时间的痛苦的例子,请看这个routine的文档。
答案 3 :(得分:1)
另外,FORTRAN77将用于编译我的代码,所以我必须坚持FORTRAN77风格
FORTRAN77是一种语言,它无法编译您的代码。你将使用哪个编译器?即使您不能将自动数组或可分配数组与FORTRAN77一起使用,我认为即使像g77
这样的编译器也支持它们。
如果你真的需要坚持严格的FORTRAN77,那么你必须要么:
但是,请听其他人并使用可分配的数组。
答案 4 :(得分:0)
我发现你不能在FORTRAN77中声明一个带变量的数组......除非有人给我一个有效的代码,我相信我必须使用替代方法