【发布时间】:2016-12-26 08:31:42
【问题描述】:
我需要摆脱一些 Fortran 程序使用的库,所以我必须在程序中使用的库中创建所有子例程。
其中一个子例程是由 C 语言完成的内存分配。
我为分配创建了自己的子程序
MODULE ARRAY_ALLOCATION
CONTAINS
SUBROUTINE ARRAY_ALLOCATE (ARR, ARR_SIZE, ARR_IDX, CODE_RET)
! DECLARE AN ALLOCATABLE PARAMETER
INTEGER, ALLOCATABLE, INTENT (INOUT) :: ARR(:)
INTEGER, INTENT (IN) :: ARR_SIZE,ARR_IDX,CODE_RET
INTEGER :: IDX_END
IDX_END = ARR_IDX + ARR_SIZE -1
ALLOCATE (ARR(ARR_IDX:IDX_END))
RETURN
END SUBROUTINE ARRAY_ALLOCATE
SUBROUTINE ARRAY_DEALLOCATE (ARR)
INTEGER, ALLOCATABLE, INTENT (INOUT) :: ARR(:)
DEALLOCATE (ARR)
RETURN
END SUBROUTINE ARRAY_DEALLOCATE
END MODULE
但我需要保留像这样integer alist(1) 没有属性allocatable 的数组声明。
例子
program test1
USE ARRAY_ALLOCATION
implicit none
integer alist(1)
call ARRAY_ALLOCATE(alist,5,3,1)
CALL Test(ALIST)
CALL ARRAY_DEALLOCATE(alist)
错误
error #7976: An allocatable dummy argument may only be argument associated with an allocatable actual argument
有没有办法在声明后创建我的数组allocatable?
我正在考虑将其设为allocatable(声明后)在子例程中分配内存,这样就不必更改旧程序中的声明。
【问题讨论】:
-
错误信息究竟是什么?关于explicit interfaces?
-
嗨,是的,这是关于显式接口错误:过程的虚拟参数有一个属性需要此过程的显式接口
-
@tsumey,请将您的代码放入问题中。例程声明以及您如何调用它就足够了。
-
顺便说一句,您知道不必在每个子程序的 and 处使用 RETURN 并在每个程序的 and 处使用 STOP 吗?它们完全没有必要。
-
“编译器说了一些关于接口的事情……”请不要这样做。如果编译器说了一些重要的话,您必须在此处准确复制消息。