Fortran 计算要分配的内存量时出现整数溢出
我正在尝试处理一个空间数据集,它存储为常规的X、Y和Z坐标网格,每个位置都有多个存储属性的字段。但是,当分配数组来存储数据时,它会抛出一个错误 目前正在使用gcc gfortran版本8.1.0 i686-posix-dwarf-rev0,由MinGW-W64项目在Win10上构建 我尝试了不同的机器,以防遇到硬件限制,并查看了各种编译器选项,但没有成功地影响结果 这是一个简化示例,其中包含当前数据集的实际处理限制:Fortran 计算要分配的内存量时出现整数溢出,fortran,x86-64,gfortran,Fortran,X86 64,Gfortran,我正在尝试处理一个空间数据集,它存储为常规的X、Y和Z坐标网格,每个位置都有多个存储属性的字段。但是,当分配数组来存储数据时,它会抛出一个错误 目前正在使用gcc gfortran版本8.1.0 i686-posix-dwarf-rev0,由MinGW-W64项目在Win10上构建 我尝试了不同的机器,以防遇到硬件限制,并查看了各种编译器选项,但没有成功地影响结果 这是一个简化示例,其中包含当前数据集的实际处理限制: program test_array implici
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位版本,我不明白为什么我会达到32位限制。因此,我研究了编译器开关,将所有整数强制为整数*8,但没有效果
有可能绕过这一限制吗?如果有,如何绕过
问题解决了
在搜索我的各种安装目录时,我遇到了另外三个安装,它们都包含一个gfortran.exe版本。不用说,这些代码优先于最近安装的MinGW编译器套件进行调用。一旦这些冗余版本被删除,测试程序和生产工具都会编译和执行,而不会为该特定型号分配高达6.5 Gb的内存
非常感谢那些评论和帮助我指出正确方向的人。上述问题是由于gfortran.exe编译器的多个实例作为其他软件包的一部分安装,例如草莓Perl,并通过直接调用正确的编译器来演示64位编译器生成的工作程序来解决 发现编译器的-v开关允许显示安装路径以及其他环境变量和版本信息。从这里,我可以追踪到不需要的前任,并删除他们,如果必要的话,删除他们过时的安装包
使用64位编译器对生成的模型进行验证,确认程序按预期工作。i686-posix-dwarf-rev0是32位arch。因此,默认情况下,它可能会生成32位代码。检查输出文件类型,例如使用文件foo.exe。如果您正在构建32位可执行文件,其中数组大小明显限制为32位,请尝试使用-m64来构建64位代码。或者,如果存在gfortran的本机MinGW-w64版本,请使用该版本。您需要安装x86-64-posix-seh工具链,该工具链具有64位gfortran。i686是严格的32位。非常感谢,先生们。在坚持修复的同时,我强制了install目录的路径,这该死的东西运行得很好。显然,我调用的是隐藏的旧版本,而不是最新的安装。当我确定原因时,将提供更新。我知道这与您的问题没有直接关系,但我强烈建议您停止使用完全非标准的real*8语法和类似语法,并开始使用kind机制-我们这里有一些问题,前者不受支持,而后者始终不会解决![已解决]或类似问题标题的任何内容。你可以写一个答案,然后接受它。每个人都可以看到这个问题有答案,甚至是公认的答案。