Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 计算要分配的内存量时出现整数溢出_Fortran_X86 64_Gfortran - Fatal编程技术网

Fortran 计算要分配的内存量时出现整数溢出

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

我正在尝试处理一个空间数据集,它存储为常规的X、Y和Z坐标网格,每个位置都有多个存储属性的字段。但是,当分配数组来存储数据时,它会抛出一个错误

目前正在使用gcc gfortran版本8.1.0 i686-posix-dwarf-rev0,由MinGW-W64项目在Win10上构建

我尝试了不同的机器,以防遇到硬件限制,并查看了各种编译器选项,但没有成功地影响结果

这是一个简化示例,其中包含当前数据集的实际处理限制:

      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机制-我们这里有一些问题,前者不受支持,而后者始终不会解决![已解决]或类似问题标题的任何内容。你可以写一个答案,然后接受它。每个人都可以看到这个问题有答案,甚至是公认的答案。