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 !等号左右有相同的数组片段应该实现循环相同的效果。

最后,再次感谢各位的热心帮助!
页: 1 2 [3]
查看完整版本: 一个数组运算的问题