Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 通过fortran中的子例程传递未知大小的数组(在子例程中分配的数组)_Arrays_Fortran_Allocation_Subroutine - Fatal编程技术网

Arrays 通过fortran中的子例程传递未知大小的数组(在子例程中分配的数组)

Arrays 通过fortran中的子例程传递未知大小的数组(在子例程中分配的数组),arrays,fortran,allocation,subroutine,Arrays,Fortran,Allocation,Subroutine,下面有一个程序,它在第一个子例程(CALCONE)中创建了一个数组,然后我想把它传递到下一个子例程(CALCTWO)中,然后将它输出到主程序中的文件中。我不知道把INTENT(IN)、INTENT(OUT)语句放在哪里,因为数组需要在子程序CALCONE中分配(因为在我的程序中,长度是在CALCONE中确定的)——我已经放弃了我的尝试,以避免混淆。有人能帮我把它们放在正确的地方吗。一旦我有了一个模板,我将了解它在未来是如何工作的。谢谢 我简化了程序,变量表示其他不能移动的东西。我只需要一种方法,

下面有一个程序,它在第一个子例程(CALCONE)中创建了一个数组,然后我想把它传递到下一个子例程(CALCTWO)中,然后将它输出到主程序中的文件中。我不知道把INTENT(IN)、INTENT(OUT)语句放在哪里,因为数组需要在子程序CALCONE中分配(因为在我的程序中,长度是在CALCONE中确定的)——我已经放弃了我的尝试,以避免混淆。有人能帮我把它们放在正确的地方吗。一旦我有了一个模板,我将了解它在未来是如何工作的。谢谢

我简化了程序,变量表示其他不能移动的东西。我只需要一种方法,在子程序之间移动一个数组,然后在主程序的末尾写出它

 program TEST
 implicit none

 integer a,b,c,d,reclen

 a = 1
 b = 2
 c = 3
 d = 4

 call CALCONE(a,b,c,d,array)

 call CALCTWO(e,f,g,h,array)

 inquire(iolength=reclen)array 
 open(unit=8,file='array_output.dat', &
   form="unformatted",access="stream")
 write(unit=8)array       
 close(unit=8)

 END PROGRAM TEST

 SUBROUTINE CALCONE(adummy,bdummy,cdummy,ddummy,arraydummy)
 IMPLICIT NONE

 integer i,j,k
 integer e,f,g,h,N
 !ALLOCATE ARRAY HERE OR IN MAIN PROGRAM?
 real*8,   allocatable  :: arraydummy(:,:)

 e = a + 1
 f = b + 1
 g = c + 1
 h = d + 1

 ! N can only be is calculated here

 allocate(arraydummy(1:N,1:3))

 !POPULATE 'arraydummy'
 !PASS ARRAY BACK OUT TO NEXT SUBROUTINE FOR FURTHER PROCESSING IN CALCTWO
 END SUBROUTINE CALCTWO

 SUBROUTINE CALCTWO(edummy,fdummy,gdummy,hdummy,arraydummy)
 IMPLICIT NONE

 integer e,f,g,h
 !DEFINE HERE ALSO? i.e.
 !real*8,   allocatable  :: arraydummy(:,:)

 e = a + 1
 f = b + 1
 g = c + 1
 h = d + 1

 arraydummy = arraydummy*e*f*g*h

 END SUBROUTINE CALCTWO

您不必在主程序中分配数组,但您肯定必须在那里声明它,并且必须将它作为参数传递(您可以这样做)。请注意,主程序中未定义符号
数组

 program TEST
 implicit none

 integer a,b,c,d,reclen

 a = 1
 b = 2
 c = 3
 d = 4

 call CALCONE(a,b,c,d,array)

 call CALCTWO(e,f,g,h,array)

 inquire(iolength=reclen)array 
 open(unit=8,file='array_output.dat', &
   form="unformatted",access="stream")
 write(unit=8)array       
 close(unit=8)

 END PROGRAM TEST

 SUBROUTINE CALCONE(adummy,bdummy,cdummy,ddummy,arraydummy)
 IMPLICIT NONE

 integer i,j,k
 integer e,f,g,h,N
 !ALLOCATE ARRAY HERE OR IN MAIN PROGRAM?
 real*8,   allocatable  :: arraydummy(:,:)

 e = a + 1
 f = b + 1
 g = c + 1
 h = d + 1

 ! N can only be is calculated here

 allocate(arraydummy(1:N,1:3))

 !POPULATE 'arraydummy'
 !PASS ARRAY BACK OUT TO NEXT SUBROUTINE FOR FURTHER PROCESSING IN CALCTWO
 END SUBROUTINE CALCTWO

 SUBROUTINE CALCTWO(edummy,fdummy,gdummy,hdummy,arraydummy)
 IMPLICIT NONE

 integer e,f,g,h
 !DEFINE HERE ALSO? i.e.
 !real*8,   allocatable  :: arraydummy(:,:)

 e = a + 1
 f = b + 1
 g = c + 1
 h = d + 1

 arraydummy = arraydummy*e*f*g*h

 END SUBROUTINE CALCTWO
确保为SUB提供显式接口。因为您使用高级特性(可分配的伪参数),所以这是必要的。最好是将它们放在一个模块中

在这两种情况下,数组都必须定义为伪参数。我在第一个声明中将其声明为intent(out),因为它是在开始时分配的。这并不是绝对必要的

另一个选项是在模块中声明数组,并让模块过程共享它

免责声明:我没有试图编译它

 module subs
   integer,parameter :: rp = kind(1d0)


   contains




   SUBROUTINE CALCONE(adummy,bdummy,cdummy,ddummy,arraydummy)
   IMPLICIT NONE

   integer i,j,k
   integer e,f,g,h,N
   !ALLOCATE ARRAY HERE OR IN MAIN PROGRAM?
   real(rp),   allocatable, intent(out) :: arraydummy(:,:)

   e = a + 1
   f = b + 1
   g = c + 1
   h = d + 1

   !N can only be is calculated here

    allocate(arraydummy(1:N,1:3))

   !POPULATE 'arraydummy'
   !PASS ARRAY BACK OUT TO NEXT SUBROUTINE FOR FURTHER PROCESSING IN CALCTWO
   END SUBROUTINE CALCTWO

   SUBROUTINE CALCTWO(edummy,fdummy,gdummy,hdummy,arraydummy)
   IMPLICIT NONE

   integer e,f,g,h
   !DEFINE HERE ALSO? i.e.
   real(rp),   allocatable, intent(inout)  :: arraydummy(:,:)

   e = a + 1
   f = b + 1
   g = c + 1
   h = d + 1

   arraydummy = arraydummy*e*f*g*h

   END SUBROUTINE CALCTWO


 end module subs

 program TEST

 use subs

 implicit none

 integer a,b,c,d,reclen

 real(rp),allocatable :: array

 a = 1
 b = 2
 c = 3
 d = 4

 call CALCONE(a,b,c,d,array)

 call CALCTWO(e,f,g,h,array)

 inquire(iolength=reclen)array 
 open(unit=8,file='array_output.dat', &
   form="unformatted",access="stream")
 write(unit=8)array       
 close(unit=8)

 END PROGRAM TEST

您不必在主程序中分配数组,但您肯定必须在那里声明它,并且必须将它作为参数传递(您可以这样做)。请注意,主程序中未定义符号
数组

 program TEST
 implicit none

 integer a,b,c,d,reclen

 a = 1
 b = 2
 c = 3
 d = 4

 call CALCONE(a,b,c,d,array)

 call CALCTWO(e,f,g,h,array)

 inquire(iolength=reclen)array 
 open(unit=8,file='array_output.dat', &
   form="unformatted",access="stream")
 write(unit=8)array       
 close(unit=8)

 END PROGRAM TEST

 SUBROUTINE CALCONE(adummy,bdummy,cdummy,ddummy,arraydummy)
 IMPLICIT NONE

 integer i,j,k
 integer e,f,g,h,N
 !ALLOCATE ARRAY HERE OR IN MAIN PROGRAM?
 real*8,   allocatable  :: arraydummy(:,:)

 e = a + 1
 f = b + 1
 g = c + 1
 h = d + 1

 ! N can only be is calculated here

 allocate(arraydummy(1:N,1:3))

 !POPULATE 'arraydummy'
 !PASS ARRAY BACK OUT TO NEXT SUBROUTINE FOR FURTHER PROCESSING IN CALCTWO
 END SUBROUTINE CALCTWO

 SUBROUTINE CALCTWO(edummy,fdummy,gdummy,hdummy,arraydummy)
 IMPLICIT NONE

 integer e,f,g,h
 !DEFINE HERE ALSO? i.e.
 !real*8,   allocatable  :: arraydummy(:,:)

 e = a + 1
 f = b + 1
 g = c + 1
 h = d + 1

 arraydummy = arraydummy*e*f*g*h

 END SUBROUTINE CALCTWO
确保为SUB提供显式接口。因为您使用高级特性(可分配的伪参数),所以这是必要的。最好是将它们放在一个模块中

在这两种情况下,数组都必须定义为伪参数。我在第一个声明中将其声明为intent(out),因为它是在开始时分配的。这并不是绝对必要的

另一个选项是在模块中声明数组,并让模块过程共享它

免责声明:我没有试图编译它

 module subs
   integer,parameter :: rp = kind(1d0)


   contains




   SUBROUTINE CALCONE(adummy,bdummy,cdummy,ddummy,arraydummy)
   IMPLICIT NONE

   integer i,j,k
   integer e,f,g,h,N
   !ALLOCATE ARRAY HERE OR IN MAIN PROGRAM?
   real(rp),   allocatable, intent(out) :: arraydummy(:,:)

   e = a + 1
   f = b + 1
   g = c + 1
   h = d + 1

   !N can only be is calculated here

    allocate(arraydummy(1:N,1:3))

   !POPULATE 'arraydummy'
   !PASS ARRAY BACK OUT TO NEXT SUBROUTINE FOR FURTHER PROCESSING IN CALCTWO
   END SUBROUTINE CALCTWO

   SUBROUTINE CALCTWO(edummy,fdummy,gdummy,hdummy,arraydummy)
   IMPLICIT NONE

   integer e,f,g,h
   !DEFINE HERE ALSO? i.e.
   real(rp),   allocatable, intent(inout)  :: arraydummy(:,:)

   e = a + 1
   f = b + 1
   g = c + 1
   h = d + 1

   arraydummy = arraydummy*e*f*g*h

   END SUBROUTINE CALCTWO


 end module subs

 program TEST

 use subs

 implicit none

 integer a,b,c,d,reclen

 real(rp),allocatable :: array

 a = 1
 b = 2
 c = 3
 d = 4

 call CALCONE(a,b,c,d,array)

 call CALCTWO(e,f,g,h,array)

 inquire(iolength=reclen)array 
 open(unit=8,file='array_output.dat', &
   form="unformatted",access="stream")
 write(unit=8)array       
 close(unit=8)

 END PROGRAM TEST