关于可分配数组的,可能导致较难检查的错误的一个特性
program mainimplicit 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(我不确定具体版本)上重现.
自古以来:简单灵活,与,严谨不易出错。都是逻辑冲突的矛盾体。
不能检查数组越界,并不是“可分配数组”的特点。
而是,“编译时不确定大小”的特点。
除了可分配数组,还有假定大小(运行时都不能确定大小)和假定形状(编译时可以确定,运行时不能确定)和自动大小数组等。
最后,楼主的代码我觉得没有什么问题的。在我这里,运行结果 c 是 5个6。
新语法里,对可分配对象,增加了自动递延功能。楼主了解一下。
页:
[1]