Fortran Coder

查看: 9481|回复: 6
打印 上一主题 下一主题

[编译器] win10系统gfortran(CodeBlocks平台)新建二进制文件导致内存错误

[复制链接]

5

帖子

1

主题

0

精华

新人

F 币
25 元
贡献
13 点
跳转到指定楼层
楼主
发表于 2020-3-2 05:05:49 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好!

本人在Window10系统(电脑配置i5-8265U,8G内存,64位操作系统)下安装了CodeBlocks的IDE平台(17.12版本),主要是想使用其gfortran编译器。通过一些简单程序测试了其可用性。但最近碰到一个奇怪的问题:open语句新建一个二进制文件,直接给出如下错误:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.


Backtrace for this error:
#0  ffffffff

源代码很短(放在一个*.f文件中做试验),其实就一个open语句:

[Fortran] 纯文本查看 复制代码
        implicit real*8 (a-h,o-z)
        ICH= 12
        IRECSZ= 1
        OPEN (UNIT   = ICH,
     .        ACCESS = 'DIRECT',
     .        FILE   = 'JPLEPH',
     .        FORM   = 'UNFORMATTED',
     .        RECL   = IRECSZ,
     .        STATUS = 'NEW',
     .        IOSTAT = iostat)
      END


试图通过重新设置系统的虚拟内存解决问题,但没有效果。

请高手指点!谢谢!

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

5

帖子

1

主题

0

精华

新人

F 币
25 元
贡献
13 点
7#
 楼主| 发表于 2020-3-4 02:23:58 | 只看该作者
kyra 发表于 2020-3-3 08:55
这种新建文件失败,有挺多的原因,比如写入的目录没有权限之类的。
可以先尝试把
STATUS = 'NEW',

谢谢版主指点!

259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
6#
发表于 2020-3-3 08:55:39 | 只看该作者
这种新建文件失败,有挺多的原因,比如写入的目录没有权限之类的。
可以先尝试把
STATUS = 'NEW',
IOSTAT = iostat
去掉。

这些子句,通常在一开始写代码(或者代码只是给自己用)的时候不写。如果后面需要完善(需要编译程序给别人用),再加上。

5

帖子

1

主题

0

精华

新人

F 币
25 元
贡献
13 点
5#
 楼主| 发表于 2020-3-3 05:06:36 | 只看该作者
kyra 发表于 2020-3-2 10:29
某个版本区间(具体忘记了)的 gfortran 有这个bug,尝试换个版本吧。(尽可能换个大版本,以避开这个区间 ...

折腾了好几天,放弃。安装了Intel Visual Fortran 2013,一下就正常了。看来在Windows系统下还是用人家配套的东西好!

5

帖子

1

主题

0

精华

新人

F 币
25 元
贡献
13 点
地板
 楼主| 发表于 2020-3-3 00:26:48 | 只看该作者
kyra 发表于 2020-3-2 10:29
某个版本区间(具体忘记了)的 gfortran 有这个bug,尝试换个版本吧。(尽可能换个大版本,以避开这个区间 ...

感谢提示!前进了一小步,运行时不报内存错误了,但问题还没彻底解决。
我的操作步骤:
1、卸载了内含gfortran的CodeBlocks v17.12,因为发现很难单独更新gfortran,也许是方法不当(替换同名文件,但会提示找不到若干dll文件,无法编译);
2、分别单独安装CodeBlocks v17.12(无编译器版) (codeblocks-17.12-setup.exe)、MinGW最新版(内含gfortran 8.2.0),添加环境变量,显示安装成功,如下:
C:\Users\86155>gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/8.2.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-8.2.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --prefix=/mingw --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-8.2.0-5' --with-gmp=/mingw --with-mpfr=/mingw --with-mpc=/mingw --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --with-isl=/mingw --enable-libgomp --disable-libvtv --enable-nls --disable-build-format-warnings
Thread model: win32
gcc version 8.2.0 (MinGW.org GCC-8.2.0-5)


3、运行前述程序(open语句中写出了可给出文件操作结果是否成功的返回值IOSTAT),编译运行时发现不提示内存错误了,但返回值IOSTAT不等于0,即二进制文件还是没成功新建
[Fortran] 纯文本查看 复制代码
        implicit real*8 (a-h,o-z)
        integer OUT
        CVL= 2

        ICH= 16
        IRECSZ= 1
        OPEN (UNIT   = ICH,
     .        FILE   = 'JPLEPH',
     .        ACCESS = 'DIRECT',
     .        FORM   = 'UNFORMATTED',
     .        RECL   = IRECSZ,
     .        STATUS = 'NEW',
     .        IOSTAT = iostat)

       write(*,*) 'iostat=',iostat

       WRITE(ICH,REC=1,IOSTAT=OUT) CVAL
       write(*,*) 'OUT=',OUT
      END


结果为:
iostat=          17
OUT=        5001

Process returned 0 (0x0)   execution time : 3.222 s
Press any key to continue.


目前gfortran单独挂出来的还有9.X版本的,但下载下来试图去替换MinGW的bin中相应文件,发现会报找不到libisl-21.dll、libmpfr-6.dll,无法编译。
还请各位高手支支招。感谢!

5

帖子

1

主题

0

精华

新人

F 币
25 元
贡献
13 点
板凳
 楼主| 发表于 2020-3-3 00:25:38 | 只看该作者
kyra 发表于 2020-3-2 10:29
某个版本区间(具体忘记了)的 gfortran 有这个bug,尝试换个版本吧。(尽可能换个大版本,以避开这个区间 ...

感谢提示!前进了一小步,运行时不报内存错误了,但问题还没彻底解决。
我的操作步骤:
1、卸载了内含gfortran的CodeBlocks v17.12,因为发现很难单独更新gfortran,也许是方法不当(替换同名文件,但会提示找不到若干dll文件,无法编译);
2、分别单独安装CodeBlocks v17.12(无编译器版) (codeblocks-17.12-setup.exe)、MinGW最新版(内含gfortran 8.2.0),添加环境变量,显示安装成功,如下:
C:\Users\86155>gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/8.2.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-8.2.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --prefix=/mingw --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-8.2.0-5' --with-gmp=/mingw --with-mpfr=/mingw --with-mpc=/mingw --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --with-isl=/mingw --enable-libgomp --disable-libvtv --enable-nls --disable-build-format-warnings
Thread model: win32
gcc version 8.2.0 (MinGW.org GCC-8.2.0-5)


3、运行前述程序(open语句中写出了可给出文件操作结果是否成功的返回值IOSTAT),编译运行时发现不提示内存错误了,但返回值IOSTAT不等于0,即二进制文件还是没成功新建
[Fortran] 纯文本查看 复制代码
        implicit real*8 (a-h,o-z)
        integer OUT
        CVL= 2

        ICH= 16
        IRECSZ= 1
        OPEN (UNIT   = ICH,
     .        FILE   = 'JPLEPH',
     .        ACCESS = 'DIRECT',
     .        FORM   = 'UNFORMATTED',
     .        RECL   = IRECSZ,
     .        STATUS = 'NEW',
     .        IOSTAT = iostat)

       write(*,*) 'iostat=',iostat

       WRITE(ICH,REC=1,IOSTAT=OUT) CVAL
       write(*,*) 'OUT=',OUT
      END


结果为:
iostat=          17
OUT=        5001

Process returned 0 (0x0)   execution time : 3.222 s
Press any key to continue.


目前gfortran单独挂出来的还有9.X版本的,但下载下来试图去替换MinGW的bin中相应文件,发现会报找不到libisl-21.dll、libmpfr-6.dll,无法编译。
还请各位高手支支招。感谢!

259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
沙发
发表于 2020-3-2 10:29:03 | 只看该作者
某个版本区间(具体忘记了)的 gfortran 有这个bug,尝试换个版本吧。(尽可能换个大版本,以避开这个区间。或者索性升级到最新版)
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-23 13:06

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表