FORTRAN 77中的2D数组声明

时间:2014-01-11 16:53:46

标签: fortran multidimensional-array fortran77

我对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行出错:数组的声明错误:非参数

上的可调维度

我不确定是什么问题,所以我来到这个

  1. 我没有正确使用数组声明(即逻辑错误)
  2. 在FORTRAN中,您无法创建数组自定义大小(我不认为会出现这种情况......)
  3. 欢迎提供示例代码和链接,但总结我应该知道的内容会很棒!

    另外,FORTRAN77将用于编译我的代码,所以我必须坚持FORTRAN77风格

5 个答案:

答案 0 :(得分:3)

这至少是Fortran 95的问题,而不是77.这是2014年!!!

您需要将数组声明为allocatable并使用

进行分配
allocate(array(rows, cols))

从文件中读取colsrows后。

这样你就不必使用子程序,但是如果程序逻辑结构支持它的话。

答案 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

修改

作为一个黑客攻击,可以尝试的一个选项如下:

  1. 将至少的二维数组声明为,作为您期望的最大值<&em;将其全部初始化为零
  2. 从文件
  3. 中读入rowcol
  4. 仅使用指定范围的数组:array(1:row,1:col)
  5. 这样可以这样工作

    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,那么你必须要么:

  • 分配一个庞大的工作数组并在子程序中使用它
  • 使用Fortran包装器在C中编写自己的分配器
  • 使用例如来自global arrays包的内存分配器。

但是,请听其他人并使用可分配的数组。

答案 4 :(得分:0)

我发现你不能在FORTRAN77中声明一个带变量的数组......除非有人给我一个有效的代码,我相信我必须使用替代方法