我想创建一个不同长度和初始化的不同数组,具体取决于我定义的一些参数的标志值。
但是,我注意到,如果在将标志值分配给某些参数后尝试定义数组,则始终存在错误。
你如何解决这个问题?
也就是说,我想做一些像
这样的事情 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,则会出错。 我如何克服这个问题并达到我的目标?
答案 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,这里有一些想法:
仅使用数组的一部分
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)
。
如果您的编译器有预处理器,您可以使用它。当然,这实际上意味着你必须知道在编译时你想要走哪两条路径。
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
通过编译器运行它,看看会发生什么。