andy8496
发表于 2017-8-7 15:55:07
惭愧!惭愧!
已经是心服口服了!
目前遇到的困难是:工程已经相当大,目前不知道那些位置有这个问题;现在想改……:-L
chiangtp
发表于 2017-8-7 16:16:04
你ˋ可能還需要考慮另一個問題:
维尼猴
发表于 2017-8-7 19:57:52
chiangtp 发表于 2017-8-7 16:16
你ˋ可能還需要考慮另一個問題:
哇,学到好多~~
{:3_59:}
能问一下这个资料从哪里可以找到么?我可能找法不对,没有搜到
chiangtp
发表于 2017-8-8 00:02:04
维尼猴 发表于 2017-8-7 19:57
哇,学到好多~~
http://pan.baidu.com/s/1i5l8Ypf
维尼猴
发表于 2017-8-8 16:50:25
chiangtp 发表于 2017-8-8 00:02
http://pan.baidu.com/s/1i5l8Ypf
O(∩_∩)O谢谢!!
mltx
发表于 2017-8-9 21:51:30
program main
implicit none
integer :: ia(5),ib(9)
ia =
ib = 0
ib(ia) = ib(ia) +
write(*,*) ib
stop
end program
没特别仔细看,试着说两句:
我用CVF和ELF90试了一下,并不累加(我还是用老古董的编译器)。
感觉写法2的语法就不应该累加。因为从语法上看,看不出来右边的ib一定要用更新的值,或对ib(5)的三次操作要累加起来。
而写法1就非常明确,等号右边总是用更新的值,就有累加效果。
写法2的累加效果可能是编译器dependent,还是用写法1比较稳妥。
chiangtp
发表于 2017-8-10 13:18:30
1. [代碼2] assign to many-one array section, 語法的 logical (非compiler責任) error, 語意就遑論了
2. 能否coding為 , 端看要做得多個能否 in any order
3 [代碼1 loop], DO I=1,5 與 DO I=5,1,-1 是不同的, 是否為andy8496的本意???
mltx
发表于 2017-8-10 19:46:25
找到了依据(by Michael Metcalf / CERN CN-AS):
Note that a vector subscript with duplicate values cannot appear on the left-hand side of an assignment as it would be ambiguous. Thus,
b( (/ 1, 7, 3, 7 /) ) = (/ 1, 2, 3, 4 /)
is illegal.
andy8496
发表于 2017-8-10 21:25:38
本帖最后由 andy8496 于 2017-8-10 21:27 编辑
当时就是想以最少的代码实现一个累加,也略微表示怀疑,但是试验后来发现成功了,就采用了,但后来才发现了这样一个大bug。
等号左边的数组片段中,表示下表的数组不能有重复元素。后来在各位的帮助下找到依据了,如15楼pasuka的资料就非常详细。
当时做这样的语法规定,个人理解是为了防止在数组初始化的时候,某个重复下表指向的成员得到了不确定的值,因为数组片段可能采用了并行的方法来赋值(纯猜测),这样就不知道最终这些重复下标的成员最终得到的是何值。
个人认为:
①在单纯的数组赋值时,编译器对于这种错误程序运行时应该报错,而不应该任由错误发生。如:
b( (/ 1, 7, 3, 7 /) ) = (/ 1, 2, 3, 4 /) ! 运行时应该有报错提示
②对于累加的需求,应该从语法层面予以支持,如:
b( (/ 1, 7, 3, 7 /) ) =b( (/ 1, 7, 3, 7 /) ) +1 !等号左右有相同的数组片段应该实现循环相同的效果。
最后,再次感谢各位的热心帮助!