Fortran Coder

查看: 23040|回复: 16
打印 上一主题 下一主题

[求助] 求解释:用module里的变量和用数字定义数组为什么结果不同

[复制链接]

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
跳转到指定楼层
楼主
发表于 2015-5-20 11:01:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
由于涉及到版权,我无法上传代码,情况大致是这样的:
在一个module里定义了一个integer::nx,
在一些子程序中调用这个module,并用nx作为一些数组的边界值。
nx在主程序刚开始就已经赋值,并且在程序中没有对其进行计算,是一个定值。在这里是146
在一个特定的子程序中,如果我在定义局部数组的时候要是用integer::njb_new(nx),则计算到后来会报错,报错的内容大致就是njb(i)=0导致数组越界,但是我用integer::njb_new(146)来定义的时候,则不会出现此错误。
在这一过程中其他部分的完全没改变。

先不管其他部分的代码的逻辑对不对,在nx=146的情况下,integer::njb_new(nx)和integer::njb_new(146)有什么区别?


愁屎了。

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

737

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
704 元
贡献
361 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2015-5-20 11:08:12 | 只看该作者
如果 nx 的值确实从来没改变过。那么 integer::njb_new(nx) 和 integer::njb_new(146) 是一样的。

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
板凳
 楼主| 发表于 2015-5-20 12:22:28 | 只看该作者
楚香饭 发表于 2015-5-20 11:08
如果 nx 的值确实从来没改变过。那么 integer::njb_new(nx) 和 integer::njb_new(146) 是一样的。 ...

还真是没变。
那个子程序只要输出一次我就让nx输出一次,整个计算过程中nx完全没变化,全都是146。但是只要用nx来设置数组就会报错。我已经无语了。

737

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
704 元
贡献
361 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

地板
发表于 2015-5-20 12:53:08 | 只看该作者
debug调试,找到越界的位置,查看下标和数组定义。

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

5#
发表于 2015-5-20 12:55:24 | 只看该作者
用了ivf吗?是的话,多半和save属性有关
既然nx事前确定,为啥不加parameter属性?

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
6#
 楼主| 发表于 2015-5-20 14:33:26 | 只看该作者
pasuka 发表于 2015-5-20 12:55
用了ivf吗?是的话,多半和save属性有关
既然nx事前确定,为啥不加parameter属性? ...

用的是microsoft visual studio 2008。
因为nx是从外部读入的,不同的case对应的nx不一样。

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

7#
发表于 2015-5-20 15:19:42 | 只看该作者
本帖最后由 pasuka 于 2015-5-20 15:23 编辑
Villain 发表于 2015-5-20 14:33
用的是microsoft visual studio 2008。
因为nx是从外部读入的,不同的case对应的nx不一样。 ...

vs2008和ivf不是一码事情。。。不能排除在循环的时候变量i其实大于nx,所以报错

不妨把i的值打印出来看看

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
8#
 楼主| 发表于 2015-5-20 17:24:48 | 只看该作者
pasuka 发表于 2015-5-20 15:19
vs2008和ivf不是一码事情。。。不能排除在循环的时候变量i其实大于nx,所以报错

不妨把i的值打印出来看看 ...

打印了,完全没问题。

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
9#
 楼主| 发表于 2015-5-20 17:35:59 | 只看该作者
本帖最后由 Villain 于 2015-5-20 17:37 编辑

file:///C:/Users/i7-32/Desktop/Image%203.png

这是用winmerge把成功运算和不成功运算两者代码比较了一下,左边是成功运算的,右边是不成功运算的。
黄色表示有区别的位置。
下面还有一条黄色,那个是因为用了allocate所以下面有个deallocate的语句。
可以看出两者只是数组的定义方式不同而已。

报错的地方是另外一个子函数,数组下标越界。

然后根据pasuka所说的,把nx+3输出,结果全部都等于146
file:///C:/Users/i7-32/Desktop/Image%206.png

求解释。

Image 3.png (87.29 KB, 下载次数: 504)

Image 3.png

Image 6.png (13.05 KB, 下载次数: 489)

Image 6.png

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

10#
发表于 2015-5-21 08:48:54 | 只看该作者
Villain 发表于 2015-5-20 17:35
这是用winmerge把成功运算和不成功运算两者代码比较了一下,左边是成功运算的,右边是不成功运算的。
黄 ...

循环的时候,数组下标呢?有一个或几个超过146了?
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-24 22:03

Powered by Tencent X3.4

© 2013-2024 Tencent

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