阵列的不同大小取决于Fortran 77中的标志值

时间:2017-10-08 21:25:39

标签: arrays fortran fortran77

我想创建一个不同长度和初始化的不同数组,具体取决于我定义的一些参数的标志值。

但是,我注意到,如果在将标志值分配给某些参数后尝试定义数组,则始终存在错误。

你如何解决这个问题?

也就是说,我想做一些像

这样的事情
   PROGRAM CODE
   IMPLICIT DOUBLE PRECISION (A-H, J-Z)
   INTEGER K1, K2
   COMMON / param  / flag

   flag=1

   if(flag.eq.1)
     DIMENSION array1(4), array2(6)
     DATA array1 /1,2,3,4/
     DATA array2 /1,2,3,4,5,6/
   elseif(flag.eq.2)
     DIMENSION array1(2), array2(3)
     DATA array1 /1,2/
     DATA array2 /1,2,3/
   endif

但是,如果在执行" flag = 1"后调用DIMENSION,则会出错。 我如何克服这个问题并达到我的目标?

1 个答案:

答案 0 :(得分:0)

首先提出一些重要建议:不要使用隐式类型。始终使用{ "query" : { "function_score" : { "functions" : [ { "random_score" : { "seed" : "randawefawfm" // generate this } } ] } }, "size" : N } 并明确声明所有变量。否则,变量名称中的拼写错误会导致奇怪且难以发现的错误。

关于你的问题:

使用Fortran 77真的很难。您的声明语句必须在执行语句之前。赋值和IMPLICIT NONE语句都是执行语句,因此只能在 声明语句之后使用。

你问过Fortran 77,所以我稍后会给出一些关于Fortran 77的信息,但首先是显而易见的:

使用Fortran 90或更高版本!

Fortran 90具有可分配的语句,并且在执行期间可能会发生分配:

if

如果你真的需要Fortran 77,这里有一些想法:

  1. 仅使用数组的一部分

    program code
        implicit none
        integer, dimension(:), allocatable :: array1, array2
        integer :: flag
    
        flag = 1
    
        if (flag == 1) then
            allocate(array1(4))
            allocate(array2(6))
            array1 = [1, 2, 3, 4]
            array2 = [1, 2, 3, 4, 5, 6]
        else
            allocate(array1(2))
            allocate(array2(3))
            array1 = [1, 2]
            array2 = [1, 2, 3]
        end if
        ...
    end program code
    

    然后只在代码中使用integer array1(4), array2(6) data array1 /1, 2, 3, 4/ data array2 /1, 2, 3, 4, 5, 6/ integer amax1, amax2 integer flag flag = 1 if (flag.eq.1) then amax1=4 amax2=6 else amax1=2 amax2=3 end if array1(1:amax1)

  2. 如果您的编译器有预处理器,您可以使用它。当然,这实际上意味着你必须知道在编译时你想要走哪两条路径。

    array2(1:amax2)

    将此保存为结尾为 PROGRAM code IMPLICIT NONE #ifdef flag INTEGER array1(4), array2(6) DATA array1 /1, 2, 3, 4/ DATA array2 /1, 2, 3, 4, 5, 6/ #else INTEGER array1(2), array2(3) DATA array1 /1, 2/ DATA array2 /1, 2, 3/ #endif PRINT *, array1, "size:", size(array1) PRINT *, array2, "size:", size(array2) END PROGRAM (大写字母F)的源文件,并使用或不使用选项.F通过编译器运行它,看看会发生什么。