回 帖 发 新 帖 刷新版面

主题:[讨论]关于可变数组在子程序中allocate的问题

我在主程序中定义了一个可变数组,通过哑元形式在子程序中allocate,编译时,编译器会提示: warning #8055: The procedure has a dummy argument that has the ALLOCATABLE, ASYNCHRONOUS, OPTIONAL, POINTER, TARGET, VALUE or VOLATILE attribute. Required explicit interface is missing from original source.   [AA]
运行后,结果还是正确的。我用的是IVF编译器,代码如下。

我想知道:
1. 提示信息是什么意思?
2. 可变数组是不是不能通过哑元形式传递?


program f
    implicit none
    integer i,n
    real,allocatable::aa(:)

    write(*,*) 'please input an integer'
    read(*,*) i 
   
    call test(aa,i)

    write(*,*) (aa(n),n=1,i)
  
stop
end 

!----------------------------------------------------------
subroutine test(aa,i)
    implicit none
    real,allocatable::aa(:)
    integer i,n
    
    allocate(aa(i))
    aa(1)=100
    do n=1, i
        aa(n)=aa(1)*n*2
    end do

end subroutine test

回复列表 (共8个回复)

沙发


需要一个显式的接口!

program f
    implicit none
    integer i,n
    real,allocatable::aa(:)

    write(*,*) 'please input an integer'
    read(*,*) i 
   
    call test(aa,i)

    write(*,*) (aa(n),n=1,i)

contains
 
subroutine test(aa,i)
    implicit none
    real,allocatable::aa(:)
    integer i,n
    
    allocate(aa(i))
    aa(1)=100
    do n=1, i
        aa(n)=aa(1)*n*2
    end do

end subroutine test

end 

板凳

这个问题似乎前几天才见过. 楼主的用法需要fortran2003才支持. 所以却决于你编译器是否足够新.

请问楼上, 写成内部函数fortran95也可以吗? 如果写成内部函数其实a和i都可以不传递直接用的.

3 楼

二楼 yeg001 说得有道理,其实楼主对 Allocatable Dummy Argument 理解程度不够。撇开 Internal procedure -- Host association 不谈,若是你的子例程传递参数 i 的话,没有必要用 Allocatable Dummy Argument。

4 楼

根据3楼的观点我将1楼的程序做了一点改动。compile,build,execute都通过,屏幕上显示:input the integer,我输入3后,出现:
    应用程序错误
“0x00401041”指令引用的“0x00000000”内存。该内存不能为“written”.

郁闷的是不知我的电脑出现了什么问题,感谢各位高手能告知。

5 楼

3楼都意思不是很理解。
这个意思?

program f
    implicit none
    integer i,n
    real,allocatable::aa(:)

    write(*,*) 'please input an integer'
    read(*,*) i 
       allocate(aa(i))
    call test(aa,i)

    write(*,*) (aa(n),n=1,i)

contains
 
subroutine test(aa,i)
    implicit none
    
    integer i,n
    real::aa(i)
    

    aa(1)=100
    do n=1, i
        aa(n)=aa(1)*n*2
    end do

end subroutine test

end 

6 楼

5 楼 aliouying 网友:您理解的没错,对于 subroutine test 参数 i 似乎没有必要。

7 楼

1楼的说法似乎有问题,这么写十有八九运行不对。
从主程序传入子程序的数组,在子程序中不能是allocate属性,只能是假定形状数组
subroutine test(aa,i)
    implicit none
    real::aa(:)
    integer i,n
……
end subroutine test
然后在主程序里写上接口,接口必须要写,就对了。
动态数组和假定形状数组是完全不同的两回事,虽然形状差不多

8 楼

[quote]5 楼 aliouying 网友:您理解的没错,对于 subroutine test 参数 i 似乎没有必要。[/quote]
直接复制的内部函数,如果是外部过程的话,还是需要传入的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册