Fortran Coder

查看: 20090|回复: 10
打印 上一主题 下一主题

[输入输出] Bad repeat count in item 1 of list input

[复制链接]

10

帖子

3

主题

0

精华

入门

F 币
120 元
贡献
35 点

规矩勋章

跳转到指定楼层
楼主
发表于 2018-12-4 13:49:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
大家好!我在运行一个程序的时候出现了错误: Fortran runtime error: Bad repeat count in item 1 of list input   (对应的程序是:read(curr%defaultval,*) curr%ival)
我上网找只有一个相关的内容而且那个情况是:后面的变量有多个,但是被read的文件内的值只有一个,所以报错。

而我的curr%ival 只需要一个变量。所以应该不是这个原因。
另外
  这个程序本来是在ia32上用ifort编译运行的,非常成熟。
但是当时在make的时候我只有gfortran ,所以我修改了Makefile 用LIBS = -llapack -lblas 来链接静态库,
一直无法通过,直到我把LIBS改成MKLLIB才make通过。我想运行的也许错误和这个有关?
  我的操作系统是Ubuntu18 64位,这个错误会不会与这个有关呢?



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

798

帖子

2

主题

0

精华

大宗师

F 币
3793 元
贡献
2268 点
沙发
发表于 2018-12-4 16:08:36 | 只看该作者
最好截个图。既然已经运行了,基本上和编译链接没有关系,不要胡猜。

63

帖子

9

主题

0

精华

专家

超凡脱俗

F 币
474 元
贡献
237 点
板凳
发表于 2018-12-4 16:11:26 | 只看该作者
本帖最后由 Jackdaw 于 2018-12-4 16:13 编辑

文件内容和变量类型不对应,检查输入文件吧


Screenshot_2018-12-04_16-10-20.png (146.33 KB, 下载次数: 406)

Screenshot_2018-12-04_16-10-20.png
天下英雄出我辈,一入江湖岁月催。

鸿图霸业谈笑间,不胜人生一场醉。

10

帖子

3

主题

0

精华

入门

F 币
120 元
贡献
35 点

规矩勋章

地板
 楼主| 发表于 2018-12-5 15:53:54 | 只看该作者
好的谢谢,我晚上看看

10

帖子

3

主题

0

精华

入门

F 币
120 元
贡献
35 点

规矩勋章

5#
 楼主| 发表于 2018-12-5 16:10:46 | 只看该作者
本帖最后由 BNUPHYKLIANG 于 2018-12-5 16:39 编辑
Jackdaw 发表于 2018-12-4 16:11
文件内容和变量类型不对应,检查输入文件吧

感谢!
[Fortran] 纯文本查看 复制代码
do i = 1, N_Param
       curr => cfg%record(i)
       curr%id         = i
       curr%pname      = PARAM_NAME(i)
       curr%ptype      = PARAM_TYPE(i)
       curr%isArray    = PARAM_ARRAY(i)
       curr%defaultval = PARAM_DVAL(i)

       if (curr%ptype .eq. TYPE_REAL) then
          read(curr%defaultval,*) curr%rval
       else if (curr%ptype .eq. TYPE_INTEGER) then
          read(curr%defaultval,*) curr%ival
       else if (curr%ptype .eq. TYPE_COMPLEX) then
          read(curr%defaultval,*) curr%cval     
       end if

这就是出错处的那个程序,提示倒数第二行read(curr%defaultval,*) curr%cval 出错,错误就
Fortran runtime error: Bad repeat count in item 1 of list input

按理说,它提前判断了数据类型,不应该再出错。
curr定义如下:

[Fortran] 纯文本查看 复制代码
 type(Param),pointer    :: curr
    integer :: i


curr=>cfg%record(i)
  对于报错的 read(curr%defaultval,*) curr%cval
  因为curr%defaultval = PARAM_DVAL(i)
中我在想是不是i的值太大导致 PARAM_DVAL(i) 中的数据已经没有了(但是它判断数据是个复数啊), PARAM_DVAL如下:
[Fortran] 纯文本查看 复制代码
character(len=*), parameter :: PARAM_DVAL(N_Param) =  &
       &(/"-1      ", "HSF.in  ", "HSF.out ", "12      ", "0.0     ", &
       &  "0       ",  &
       &  "0.001   ", "0.0     ", "8       ", "0.125   ", "0.001   ", &
       &  "quest   ", "geom.def", "8       ", "0.0     ", "8       ", &
       &  "16      ", "10      ", "50      ", "4       ", "12      ", &
       &  "12      ", "5000    ", "30      ", "0       ", "1000    ", &
       &  "12      ", "4       ", "4       ", "2       ", "0.0001  ", &
       &  "0       ", "1.0     ", "10      "/)




10

帖子

3

主题

0

精华

入门

F 币
120 元
贡献
35 点

规矩勋章

6#
 楼主| 发表于 2018-12-5 16:19:19 | 只看该作者
本帖最后由 BNUPHYKLIANG 于 2018-12-5 17:42 编辑
li913 发表于 2018-12-4 16:08
最好截个图。既然已经运行了,基本上和编译链接没有关系,不要胡猜。

好的,谢谢您!
那和编译器也没关系吗?我看网上有个外国论坛说了什么用ifort 和gFortran 编译运行的结果不一样,并且有一次  类似read(....)x,y,z 出错,ifort read了3个数据,gfortran  read了1个数据截图如下
图中错误代码是:
[Fortran] 纯文本查看 复制代码
do i = 1, N_Param
       curr => cfg%record(i)
       curr%id         = i
       curr%pname      = PARAM_NAME(i)
       curr%ptype      = PARAM_TYPE(i)
       curr%isArray    = PARAM_ARRAY(i)
       curr%defaultval = PARAM_DVAL(i)

       if (curr%ptype .eq. TYPE_REAL) then
          read(curr%defaultval,*) curr%rval
       else if (curr%ptype .eq. TYPE_INTEGER) then
          read(curr%defaultval,*) curr%ival
       else if (curr%ptype .eq. TYPE_COMPLEX) then
          read(curr%defaultval,*) curr%cval
       end if

就是倒数第二行出错,根据curr%defaultval = PARAM_DVAL(i) 我找到了 PARAM_DVAL如下:
[Fortran] 纯文本查看 复制代码
character(len=*), parameter :: PARAM_DVAL(N_Param) =  &
       &(/"-1      ", "HSF.in  ", "HSF.out ", "12      ", "0.0     ", &
       &  "0       ",  &
       &  "0.001   ", "0.0     ", "8       ", "0.125   ", "0.001   ", &
       &  "quest   ", "geom.def", "8       ", "0.0     ", "8       ", &
       &  "16      ", "10      ", "50      ", "4       ", "12      ", &
       &  "12      ", "5000    ", "30      ", "0       ", "1000    ", &
       &  "12      ", "4       ", "4       ", "2       ", "0.0001  ", &
       &  "0       ", "1.0     ", "10      "/)

本来我先想办法看看是第几次循环出错
在循环中加入了print *,i :就在do i=1,N_Param 后面。
[Fortran] 纯文本查看 复制代码
 do i = 1, N_Param
        print *, i
       curr => cfg%record(i)
       curr%id         = i
       curr%pname      = PARAM_NAME(i)
       curr%ptype      = PARAM_TYPE(i)
       curr%isArray    = PARAM_ARRAY(i)
       curr%defaultval = PARAM_DVAL(i)

       if (curr%ptype .eq. TYPE_REAL) then
          read(curr%defaultval,*) curr%rval
       else if (curr%ptype .eq. TYPE_INTEGER) then
          read(curr%defaultval,*) curr%ival
       else if (curr%ptype .eq. TYPE_COMPLEX) then
          read(curr%defaultval,*) curr%cval
       end if



再make并运行,出现了变化,从1显示到第33,也就是第33次循环除了问题,我看第33个数明明是1.0 不应该判断它是复数啊,而在下面出错时却是
else if (curr%ptype .eq. TYPE_COMPLEX) then

          read(curr%defaultval,*) curr%cval


所以是不是在程序运行过程中数据被改变了


捕获.PNG (55.17 KB, 下载次数: 385)

捕获.PNG

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
7#
发表于 2018-12-5 21:44:50 | 只看该作者
你要看 PARAM_TYPE 的值。
你的代码里我没有看到自动判断参数类型的代码,可能是写死的。(而不是动态判断的)

10

帖子

3

主题

0

精华

入门

F 币
120 元
贡献
35 点

规矩勋章

8#
 楼主| 发表于 2018-12-7 18:59:39 | 只看该作者
好的谢谢,最后我发现问题出在编译器上,gfortran的编译规则应该更严格,而源程序用的时ifort今天我安装了ifort就解决了,代码中的原始数据是字符串,只不过作者在此处用的是复数,所以用了read。问题在于他直接read(字符串,*)复数   这个在ifort里可以,在gfortran里不行(可能因为gfortran认为复数应该有两个部分)

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
9#
发表于 2018-12-8 11:02:55 | 只看该作者
同一个问题,往往有多种解答。

楼主把它归结于“编译器差异”,倒不是不可以。

不过,我认为问题出在 PARAM_TYPE(i) 的值。 不应该是 TYPE_COMPLEX

10

帖子

3

主题

0

精华

入门

F 币
120 元
贡献
35 点

规矩勋章

10#
 楼主| 发表于 2018-12-13 14:41:50 | 只看该作者
嗯,主要是源程序作者这样设计的,我想的是有可能经过迭代以后那个值是复数,只是输入的初始值是实数
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-4-26 22:19

Powered by Tencent X3.4

© 2013-2024 Tencent

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