Fortran Coder

查看: 2737|回复: 5
打印 上一主题 下一主题

[求助] 关于Fortran动态数组的若干问题

[复制链接]

17

帖子

6

主题

0

精华

入门

F 币
74 元
贡献
42 点
跳转到指定楼层
楼主
发表于 2023-3-20 15:32:25 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
今天看Fortran动态数组相关问题的时候遇到了一些问题。1、写代码的时候,如果直接定义integer::m=5,下一行写real*8 a(m),那编译将无法通过;但是如果在一个subroutine里,这个m作为子程序的输入参数传进来,在
integer::m后,可以下一行跟real*8 a(m),能成功编译,请问都是变量,为什么第一种形式不能编译,而第二种可以。
2、在后续作测试的时候发现,把一个数组a(大小为m,即5,初始化后里面为5个0.0)传入subroutine后,我在subroutine定义real,dimension(n)::a时,手滑将n达成了
阿拉伯数字的1,即real,dimension(1)::a,可程序仍可以正常编译,运行exe之后仍能输出正常的结果。代码如下,请大家不吝赐教,谢谢了!
[Fortran] 纯文本查看 复制代码
Program main
    implicit none   
    integer::m=5
    call dyaraayini(m) 
end

Subroutine dyaraayini(n)
    implicit none
    integer n,i
    real dya(n)
    do i=1,n
        dya(i)=0.0
    end do
    write(*,*)dya
    call arraytest(dya,n)
    write(*,*)dya
end 



Subroutine arraytest(a,n)
    implicit none
    integer i,n
    real,dimension(1)::a
!    real,dimension(n)::a
    do i=1,n
        a(i)=1+i
    end do
end





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

17

帖子

6

主题

0

精华

入门

F 币
74 元
贡献
42 点
6#
 楼主| 发表于 2023-3-21 09:04:10 | 只看该作者
青衣巷 发表于 2023-3-20 19:43
问题1,请注意:
integer::m=5  是变量。
integer , parameter :: m=5 才是常量

非常感谢

81

帖子

0

主题

0

精华

专家

F 币
471 元
贡献
232 点

规矩勋章新人勋章元老勋章

QQ
5#
发表于 2023-3-20 19:43:36 | 只看该作者
本帖最后由 青衣巷 于 2023-3-20 21:28 编辑

问题1,请注意:
integer::m=5  是变量。
integer , parameter :: m=5 才是常量
普通数组的大小只能是常量,不能是变量。
子程序的局部变量数组,可以用虚参做为大小(称为自动数组Automatic Array)。
但是不推荐,因为会占用堆栈。当数组大小较大的时候,很容易堆栈溢出。

问题2
实参数组的大小可以比虚参大,但不能比虚参小。
可以这样理解:虚参是提要求的,实参必须至少满足虚参的要求,多余的部分虚参不需要。


评分

参与人数 1F 币 +2 收起 理由
kyra + 2 很给力!

查看全部评分

彼岸,有永恒的守候...

146

帖子

42

主题

1

精华

宗师

F 币
1273 元
贡献
629 点
地板
发表于 2023-3-20 19:34:04 来自移动端 | 只看该作者
第二个问题:C语言,数组名即数组首地址,FORTRAN类似,a(1)即数组首地址

146

帖子

42

主题

1

精华

宗师

F 币
1273 元
贡献
629 点
板凳
发表于 2023-3-20 19:27:45 来自移动端 | 只看该作者
情况1,常量可以;情况2,自动数组。这些书上都有

评分

参与人数 1F 币 +2 收起 理由
kyra + 2 很给力!

查看全部评分

17

帖子

6

主题

0

精华

入门

F 币
74 元
贡献
42 点
沙发
 楼主| 发表于 2023-3-20 15:43:43 | 只看该作者
[Fortran] 纯文本查看 复制代码
Program main
    implicit none   
    integer::m=5
    call dyaraayini(m) 
end
    
Subroutine dyaraayini(n)
    implicit none
    integer n,i
    real dya(n)
    do i=1,n
        dya(i)=0.0
    end do
    write(*,*)dya
    call arraytest(dya,n)
    write(*,*)dya
end 

    

Subroutine arraytest(a,n)
    implicit none
    integer i,n
    real,dimension(1)::a
!    real,dimension(n)::a
    do i=1,n
        a(i)=1+i
    end do
end 
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-11-23 16:37

Powered by Tencent X3.4

© 2013-2024 Tencent

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