Fortran Coder

标题: 关于可分配数组的,可能导致较难检查的错误的一个特性 [打印本页]

作者: 三角    时间: 2019-8-10 01:12
标题: 关于可分配数组的,可能导致较难检查的错误的一个特性
[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(我不确定具体版本)上重现.


作者: vvt    时间: 2019-8-10 08:06
自古以来:简单灵活,与,严谨不易出错。都是逻辑冲突的矛盾体。

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

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

最后,楼主的代码我觉得没有什么问题的。在我这里,运行结果 c 是 5个6。
新语法里,对可分配对象,增加了自动递延功能。楼主了解一下。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2