我正在尝试处理存储为常规X,Y和Z坐标网格的空间数据集,每个位置都有多个存储属性的字段。但是,在分配用于存储数据的数组时,它将引发错误。
当前在Win10上使用gcc gfortran版本8.1.0(i686-posix-dwarf-rev0,由MinGW-W64项目构建)。
我尝试了不同的机器(以防万一我遇到硬件限制),并查看了各种编译器选项,但没有设法影响结果。
这是一个简化的示例,其中包含当前要处理的数据集的实际限制:
program test_array
implicit none
real*8, allocatable :: test(:,:,:,:)
integer*4 x,y,z,vars
x=382
y=390
z=362
vars=15
print *, "Total bytes: ", x*y*z*vars*8
allocate(test(x,y,z,vars))
print *, "Allocated"
deallocate(test)
print *, "Deallocated"
end program test_array
程序可以正常编译,但是在执行时返回以下错误:
Total bytes: -2118243392
Fortran runtime error: Integer overflow when calculating the amount of memory to allocate
Error termination. Backtrace:
Could not print backtrace: libbacktrace could not find executable to open
#0 0x41ad93
#1 0x413fee
#2 0x411d50
#3 0x401807
#4 0x4019dd
#5 0x40138a
很明显,我超出了32位整数限制,但是由于我使用的是x64系统,并且(据我所知)编译器是64位版本,所以我不明白为什么m达到32位限制。因此,我研究了编译器开关,将所有整数强制为INTEGER * 8无效。
是否有可能绕过此限制?如果是,怎么办?
问题已解决!
在搜索各种安装DIR时,我遇到了另外三个都包含gfortran.exe版本的安装。不用说,这些文件优先于最近安装的MinGW编译器套件来调用。一旦删除了这些冗余版本,测试程序和生产工具就可以毫无问题地进行编译和执行(该特定型号的内存分配高达6.5 Gb)。
非常感谢那些发表评论并帮助我指出正确方向的人。
答案 0 :(得分:1)
上述问题是由于gfortran.exe编译器的多个实例作为其他软件包(例如Strawberry Perl)的一部分安装的,并通过直接调用正确的编译器以演示64位编译器产生了正常工作的程序而得以解决。 / p>
为编译器发现-v开关,可以显示安装路径以及其他环境变量和版本信息。从这里,我可以找到不需要的EXE并删除它们,并在必要时删除它们已过期的安装包。
使用64位编译器处理的结果模型的验证确认程序可以按预期工作。