Fortran Coder

查看: 15356|回复: 6
打印 上一主题 下一主题

[讨论] fortran中‘:'在数组循环用的应用问题

[复制链接]

136

帖子

3

主题

0

精华

版主

F 币
1964 元
贡献
1677 点

帅哥勋章管理勋章爱心勋章新人勋章热心勋章元老勋章

跳转到指定楼层
楼主
发表于 2014-3-1 11:11:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
今天调试程序的时候发现一个非常有意思的问题,我的编译器是IVF2013 update1,平台是VS2012,系统win7 32bit

我把程序单独拿出来了,数据见文件。
程序如下:

[Fortran] 纯文本查看 复制代码
Program MemTest
Implicit None
Integer :: nEle, nNod
Integer, Allocatable    :: emap(:,:)
Integer, Allocatable    :: nEleIn(:),nodEle(:,:)
Integer :: i, j


Open( Unit = 11, File = 'in.dat' )
    Read(11,*) nEle, nNod
    allocate( emap(3,nEle) )
    Read(11,*) emap
Close( Unit = 11 )


    allocate( nEleIn( nNod ), nodEle( nNod,15) )
    nEleIn = 0
    nodEle = 0
!
! Loop all element
!
DO i = 1, nEle
    nelein(emap(:,i)) = nelein(emap(:,i)) + 1
    nodele(emap(:,i),nelein(emap(:,i)))   = i 
EndDo

    Write(*,*) nEleIn(88) 
    write(*,*) nodEle( 88, : )
    
    
! Anothe Method

! initial zeros
    nEleIn = 0
    nodEle = 0
DO i = 1, nEle
    ForAll( j = 1 : 3 ) 
        nelein(emap(j,i)) = nelein(emap(j,i)) + 1
        nodele(emap(j,i),nelein(emap(j,i)))   = i 
    EndForAll
EndDo

    Write(*,*) nEleIn(88) 
    write(*,*) nodEle( 88, : )
    
    !
    ! deallocate Memory
    !
    Deallocate( emap, nEleIn, nodEle )
    
    stop
End Program MemTest


输出结果为:


附件,输入数据文件:

out.jpg (23.78 KB, 下载次数: 996)

out.jpg

in.rar

3.27 KB, 下载次数: 2

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2014-3-1 11:21:45 | 只看该作者
没发现亮点啊

136

帖子

3

主题

0

精华

版主

F 币
1964 元
贡献
1677 点

帅哥勋章管理勋章爱心勋章新人勋章热心勋章元老勋章

板凳
 楼主| 发表于 2014-3-1 11:48:32 | 只看该作者
好吧,其实是应该注意下矩阵的赋值的问题,很容易出错

736

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
700 元
贡献
359 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

地板
发表于 2014-3-1 12:12:47 | 只看该作者
版主的新手帖,速度围观。

嗯数组下标来自于另一个数组的值,a(b(i)) 这种,特别需要额外注意。

136

帖子

3

主题

0

精华

版主

F 币
1964 元
贡献
1677 点

帅哥勋章管理勋章爱心勋章新人勋章热心勋章元老勋章

5#
 楼主| 发表于 2014-3-1 13:51:43 | 只看该作者
chuxf 发表于 2014-3-1 12:12
版主的新手帖,速度围观。

嗯数组下标来自于另一个数组的值,a(b(i)) 这种,特别需要额外注意。 ...

这种还算比较好,比如a(b),若a,b是一维数组,为了表征b是一维数组,可以写成a(b(:))
若a是二维数组,调用的时候a(b(1:3),b(1:3))实际是一个小矩阵的范围,而不是行和列都是a(b(1),b(1)),a(b(2),b(2)),a(b(3),b(3))

当然这些都是小问题,我只是举个例子,写顺手偷懒了容易出错。

736

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
700 元
贡献
359 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

6#
发表于 2014-3-1 13:58:59 | 只看该作者
你的意思是说 a( b(1:3) , b(1:3) ) 实际有9个元素,而非 3 个,是吧?

136

帖子

3

主题

0

精华

版主

F 币
1964 元
贡献
1677 点

帅哥勋章管理勋章爱心勋章新人勋章热心勋章元老勋章

7#
 楼主| 发表于 2014-3-1 15:52:19 | 只看该作者
chuxf 发表于 2014-3-1 13:58
你的意思是说 a( b(1:3) , b(1:3) ) 实际有9个元素,而非 3 个,是吧?

必须啊
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-22 13:02

Powered by Tencent X3.4

© 2013-2024 Tencent

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