Fortran Coder

标题: 关于Fortran动态数组的若干问题 [打印本页]

作者: 一个憎学家    时间: 2023-3-20 15:32
标题: 关于Fortran动态数组的若干问题
今天看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






作者: 一个憎学家    时间: 2023-3-20 15: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

作者: weixing1531    时间: 2023-3-20 19:27
情况1,常量可以;情况2,自动数组。这些书上都有
作者: weixing1531    时间: 2023-3-20 19:34
第二个问题:C语言,数组名即数组首地址,FORTRAN类似,a(1)即数组首地址
作者: 青衣巷    时间: 2023-3-20 19:43
本帖最后由 青衣巷 于 2023-3-20 21:28 编辑

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

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



作者: 一个憎学家    时间: 2023-3-21 09:04
青衣巷 发表于 2023-3-20 19:43
问题1,请注意:
integer::m=5  是变量。
integer , parameter :: m=5 才是常量

非常感谢




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2