Fortran Coder

查看: 46|回复: 1

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

[复制链接]

1

帖子

1

主题

0

精华

新人

F 币
28 元
贡献
9 点
发表于 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(我不确定具体版本)上重现.

回复

使用道具 举报

699

帖子

0

主题

0

精华

大师

F 币
698 元
贡献
389 点

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

QQ
发表于 2019-8-10 08:06:36 | 显示全部楼层
自古以来:简单灵活,与,严谨不易出错。都是逻辑冲突的矛盾体。

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

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

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

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2019-8-22 00:03

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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