对于4个子程序使用的公共块的某些数组(不是全部),我需要双精度。问题是通过将公共块从表单A更改为B,我的代码在几次迭代后就会爆炸。
A)
COMMON/MYBK/
C0(I,J,K),C1(I,J,K),C2(I,J,K),
& C3(I,J,K),C4(I,J,K),C5(I,J,K),
& CD0(I,J,K),CD1(I,J,K),CD2(I,J,K),
& CD3(I,J,K),CD4(I,J,K),CD5(I,J,K)
B)
DOUBLE PRECISION
& C0(I,J,K),C1(I,J,K),C2(I,J,K)
COMMON/MYBK/
C0,C1,C2,
& C3(I,J,K),C4(I,J,K),C5(I,J,K),
& CD0(I,J,K),CD1(I,J,K),CD2(I,J,K),
& CD3(I,J,K),CD4(I,J,K),CD5(I,J,K)
提前致谢。
答案 0 :(得分:1)
公共块在不同作用域单元中的变量之间建立存储关联(Fortran 2008 Cl 16.5.3)。存储关联上下文中的非指针数组将“占据一系列连续的存储序列,每个数组元素一个,以数组元素顺序”。
您正在使用公共区块执行的操作:
COMMON/MYBK/
& C0(I,J,K),C1(I,J,K),C2(I,J,K),
& C3(I,J,K),C4(I,J,K),C5(I,J,K),
& CD0(I,J,K),CD1(I,J,K),CD2(I,J,K),
& CD3(I,J,K),CD4(I,J,K),CD5(I,J,K)
这将定义一个内存块,以便这些数组中的每一个都以连续的存储顺序布置在每个变量的背靠背中。公共块的定义确定块出现的每个作用域单元共享的单个存储关联。
如果在一个作用域单元中更改任何这些变量的类型,而不是所有这些变量的类型,则会发生的情况是存储关联中哪些字节属于哪些变量以及它们出现的索引不匹配。例如,如果C0
在一个作用域单元中是real
而另一个作用域单元中的double precision
和通过公共块关联的存储,则声明数组C0(1)
的第一个元素在其作用域单元中double precision
将占用与作用域C0(1:2)
中的real
的前两个元素相同的数据,它被声明为C0
。
如果您要将C1
,C2
和double precision
更新为C0
,则无需修改任何常用块,但必须确保该类型C1
,C2
和HorizontalAlignment="Left"
的类型和等级在引用公共块的每个作用域单元中是相同的。如果不这样做,您将在存储关联中出现不匹配,并且您的程序将无法运行。