Fortran 可分配数组(实型)的内存分配问题
我是Fortran编程新手,所以我需要关于可分配数组的帮助 这是我的简单代码:Fortran 可分配数组(实型)的内存分配问题,fortran,gfortran,Fortran,Gfortran,我是Fortran编程新手,所以我需要关于可分配数组的帮助 这是我的简单代码: PROGRAM MY_SIMPLE_CODE IMPLICIT NONE INTEGER :: N_TMP, ALLOC_ERR, DEALLOC_ERR REAL, ALLOCATABLE, DIMENSION(:) :: P_POT WRITE( *,* ) "ENTER THE VALUE FOR N_TMP:" READ( *,* ) N_TMP IF ( .NOT. ALLOCATED( P_P
PROGRAM MY_SIMPLE_CODE
IMPLICIT NONE
INTEGER :: N_TMP, ALLOC_ERR, DEALLOC_ERR
REAL, ALLOCATABLE, DIMENSION(:) :: P_POT
WRITE( *,* ) "ENTER THE VALUE FOR N_TMP:"
READ( *,* ) N_TMP
IF ( .NOT. ALLOCATED( P_POT) ) ALLOCATE( P_POT( N_TMP), STATUS = ALLOC_ERR )
IF ( ALLOC_ERR .NE. 0 ) STOP( "ERROR - ALLOCATION P_POT !!!")
IF ( ALLOCATED( P_POT) ) DEALLOCATE( P_POT, STATUS = DEALLOC_ERR )
IF ( DEALLOC_ERR .NE. 0 ) STOP( "ERROR - DEALLOCATION P_POT !!!")
END PROGRAM MY_SIMPLE_CODE
当我协同构建此代码时,收到以下错误消息:
Allocate对象既不是数据指针,也不是可分配变量
这个代码有什么问题
在这个简单的代码中可以隐藏哪些棘手的东西
IDE:代码::块TDM_GCC_5 1 0
OS:Win 10 X64正如@Steve在评论中所说,分配/解除分配状态的关键字是
STAT
,而不是status
。出现错误的原因是编译器无法识别该名称,并认为它是一个变量
此外,还有一个语法错误,因为STOP
语句和开始大括号之间必须至少有一个空格(或者根本没有大括号)
我不知道代码::块,但我注意到您在分配和解除分配中使用了
STATUS=
术语。这是错误的,关键字是STAT=
。这可能是chw21所说的,但是为什么不发布错误消息让我们看看呢?@monocharic由于我添加了错误消息,问题现在完成了。您的代码中有两个错误。首先,正如@chw21所指出的,您希望STAT=
而不是STATUS
。错误正确地指向状态
。gfortran假定if是一个变量名。其次,STOP
不使用意合。删除它们。@Steve我并没有从编译器那个里得到关于parathesis是语法错误的警告。为什么?我可以得到一个解释,因为我想知道原因。这并不是说不允许STOP(“x”)
,而是必须写为STOP“x”
,但是STOP(“x”)
是不允许的。第一个有效,最后一个无效(放置空格)。这很奇怪。。。Fortran一般不区分空格,特别是大括号。这并不奇怪:它(以自由形式)与必须编写real x
而不是realx
或100 continue
而不是100 continue
没有什么区别。如果(x)是允许的,而stop(x)
是不允许的,不同之处在于,在后一种情况下,(
是常数(x)
的一个组成部分,就像你不能让停止1而不是停止1
。
IF ( .NOT. ALLOCATED( P_POT) ) ALLOCATE( P_POT( N_TMP), STAT = ALLOC_ERR )
IF ( ALLOC_ERR .NE. 0 ) STOP "ERROR - ALLOCATION P_POT !!!"
!(...)
IF ( ALLOCATED( P_POT) ) DEALLOCATE( P_POT, STAT = DEALLOC_ERR )
IF ( DEALLOC_ERR .NE. 0 ) STOP "ERROR - DEALLOCATION P_POT !!!"