#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_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-object is neither a data pointer nor an allocatable variable
Что не так с этим кодом?
Какие хитрые вещи можно замаскировать в этом простом коде?
IDE: Code::Blocks TDM_GCC_5 1 0
ОС: Win 10 X64
Комментарии:
1. Я не знаю о Code::Blocks, но я заметил, что вы используете
STATUS=
термин при выделении и освобождении. Это неправильно, ключевое словоSTAT=
.2. Вероятно, так сказал chw21, но почему бы вам не опубликовать сообщение об ошибке, чтобы мы могли его увидеть?
3. @Monochromatic Вопрос теперь завершен, потому что я добавил сообщение об ошибке.
4. В вашем коде две ошибки. Во-первых, как указал @chw21, вы хотите
STAT=
вместоSTATUS
. Ошибка правильно указывает наSTATUS
. gfortran предположил, что if — это имя переменной. Во-вторых,STOP
не использует parathesis. Удалите их.5. @Steve Я не получил предупреждения от компилятора о том, что паратезисы являются синтаксической ошибкой. Почему? Могу ли я получить объяснение, потому что я хочу знать причину этого.
Ответ №1:
Точно так же, как @Steve сказал в комментарии, ключевое слово для статуса выделения / освобождения — STAT
, не STATUS
. Ошибка возникает из-за того, что компилятор не распознает имя и думает, что это переменная.
Кроме того, имеется синтаксическая ошибка, поскольку между STOP
оператором и открывающей фигурной скобкой должен быть хотя бы пробел (или вообще не должно быть фигурных скобок).
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 !!!"
Комментарии:
1. Дело не столько в том, что
STOP ("x")
не разрешено и должно быть записано какSTOP "x"
, сколько в том, чтоSTOP( "x" )
не разрешено. Первое допустимо, последнее — нет (размещение пробелов).2. Это странно… Fortran вообще не чувствителен к пробелам, особенно с фигурными скобками.
3. Не очень странно: это ничем не отличается (в свободной форме) от необходимости писать
real x
вместоrealx
или100 continue
вместо100continue
и т.д.if(x)
разрешено, тогда какstop(x)
нет, и разница в том, что в последнем случае(
является неотъемлемой частью константы(x)
— так же, как вы не можете иметьstop1
вместоstop 1
.