Проблема с выделением памяти для выделяемого массива (реальный тип)

#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 .