Fortran Coder

楼主: andy8496
打印 上一主题 下一主题

[讨论] 一个数组运算的问题

[复制链接]

131

帖子

34

主题

0

精华

宗师

F 币
1602 元
贡献
813 点
21#
 楼主| 发表于 2017-8-7 15:55:07 | 只看该作者
惭愧!惭愧!
已经是心服口服了!
目前遇到的困难是:工程已经相当大,目前不知道那些位置有这个问题;现在想改……

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

22#
发表于 2017-8-7 16:16:04 | 只看该作者
你ˋ可能還需要考慮另一個問題:

array-expression-assignment.pdf

117.25 KB, 下载次数: 3

47

帖子

3

主题

0

精华

大师

F 币
1634 元
贡献
119 点

规矩勋章

23#
发表于 2017-8-7 19:57:52 | 只看该作者
chiangtp 发表于 2017-8-7 16:16
你ˋ可能還需要考慮另一個問題:

哇,学到好多~~



能问一下这个资料从哪里可以找到么?我可能找法不对,没有搜到

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

24#
发表于 2017-8-8 00:02:04 | 只看该作者

47

帖子

3

主题

0

精华

大师

F 币
1634 元
贡献
119 点

规矩勋章

25#
发表于 2017-8-8 16:50:25 | 只看该作者
chiangtp 发表于 2017-8-8 00:02
http://pan.baidu.com/s/1i5l8Ypf

O(∩_∩)O谢谢!!

2

帖子

0

主题

0

精华

入门

F 币
37 元
贡献
21 点
26#
发表于 2017-8-9 21:51:30 | 只看该作者
[Fortran] 纯文本查看 复制代码
program main
implicit none
   integer :: ia(5),ib(9)
   ia = [1,5,5,5,2]
   ib = 0
   ib(ia) = ib(ia) + [1,1,1,1,1]
   write(*,*) ib
   stop
end program

没特别仔细看,试着说两句:
我用CVF和ELF90试了一下,并不累加(我还是用老古董的编译器)。
感觉写法2的语法就不应该累加。因为从语法上看,看不出来右边的ib一定要用更新的值,或对ib(5)的三次操作要累加起来。
而写法1就非常明确,等号右边总是用更新的值,就有累加效果。

写法2的累加效果可能是编译器dependent,还是用写法1比较稳妥。

评分

参与人数 1F 币 +8 贡献 +8 收起 理由
fcode + 8 + 8 欢迎mltx老师

查看全部评分

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

27#
发表于 2017-8-10 13:18:30 | 只看该作者
1. [代碼2] assign to many-one array section, 語法的 logical (非compiler責任) error, 語意就遑論了
2. [Squential DO] 能否coding為 [ARRAY assignment], 端看要做得多個能否 in any order
3 [代碼1 loop], DO I=1,5 與 DO I=5,1,-1 是不同的, 是否為andy8496的本意???

2

帖子

0

主题

0

精华

入门

F 币
37 元
贡献
21 点
28#
发表于 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.

131

帖子

34

主题

0

精华

宗师

F 币
1602 元
贡献
813 点
29#
 楼主| 发表于 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 !等号左右有相同的数组片段应该实现循环相同的效果。

最后,再次感谢各位的热心帮助!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-23 23:56

Powered by Tencent X3.4

© 2013-2024 Tencent

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