Fortran Coder

查看: 6882|回复: 1
打印 上一主题 下一主题

[讨论] 关于可分配数组的,可能导致较难检查的错误的一个特性

[复制链接]

1

帖子

1

主题

0

精华

新人

F 币
30 元
贡献
10 点
跳转到指定楼层
楼主
发表于 2019-8-10 01:12:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
    program main
    implicit none
    integer::a(10),b(5)
    integer,allocatable::c(:)
    allocate(c(8))
    a=3
    b=2
    c=a    c=b*c
    end program main


代码如上
对于不可分配数组a,b, 当直接执行c=a*b时, 由于a,b大小不一致, 所以编译时会报错.
但是当c为可分配数组, 并且c与b大小不一致时, 却可以执行b*c这样的语句 (经过实验,c*b与b*c这样的语句,最终生成的数组的大小,与排在首位的数组一致), 并且不会抛出运行时错.
而且这一种处理方式无法通过手动为c分配空间进行解决, 但是这样的处理方式却有可能导致最终的计算结果存在一定的错误, 并且除了单步调试外, 可能没有很好的方法能检查出来这个地方.


这个问题应该可以在ivf2019和codeblocks 17.12附带的gfortran(我不确定具体版本)上重现.

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

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
沙发
发表于 2019-8-10 08:06:36 | 只看该作者
自古以来:简单灵活,与,严谨不易出错。都是逻辑冲突的矛盾体。

不能检查数组越界,并不是“可分配数组”的特点。
而是,“编译时不确定大小”的特点。

除了可分配数组,还有假定大小(运行时都不能确定大小)和假定形状(编译时可以确定,运行时不能确定)和自动大小数组等。

最后,楼主的代码我觉得没有什么问题的。在我这里,运行结果 c 是 5个6。
新语法里,对可分配对象,增加了自动递延功能。楼主了解一下。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-31 02:09

Powered by Tencent X3.4

© 2013-2024 Tencent

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