2014-02-21 4 views
0

У меня есть вопрос, который, надеюсь, не будет влиять на мои численные расчеты в Fortran 90.Как числовые типы управляемых в Fortran 90

Дело в том, что я массив объявлен как

Real(r8), Allocatable    :: matKBody(:) 

По моим вручную, инициализировав такой массив, я сделал это как

allocate(matKBody(1:Nk), STAT=ierr) 
If (ierr /= 0) Stop 
matKBody(:) = (0.0_r8, 0.0_r8) 

, который является способом инициализации сложного массива. Я заметил эту ошибку, но я был удивлен , что Безразлично ' имеет значения, если я инициализировать такой массив таким способом или с помощью ' правильно ' заявление:

matKBody(:) = 0.0_r8 
... 
... ! Do some stuff with the array 
... 
Deallocate(matKBody, STAT=ierr) 
If (ierr /= 0) Stop 

Если я печатаю обоих массивов они дают мне правильную инициализацию, т.е. как инициализировать действительные числа .

Почему fortran (или компилятор) не знает о таких вещах? (я использовал ifort для компиляции).

+0

Вам нужно выделить allocatable array, используя функцию 'ALLOCATE()'. – ja72

+0

Какая ошибка? Непонятно, что вы спрашиваете. – ja72

+0

Я добавил более краткий подход к используемому массиву. Ошибка в том, что массив объявлен как реальный, но Я могу инициализировать как комплексное, или действительное число, и вопрос , почему это действительно. – user2820579

ответ

1

Полный пример:

program test_convert 

use, intrinsic :: ISO_FORTRAN_ENV 

Real(real64), Allocatable    :: matKBody(:) 

allocate (matKBody (1:10)) 
matKBody(:) = (0.0_real64, 0.0_real64) 

end program test_convert 

Собран с gfortran с опциями: -O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fcheck=all -std=f2008 -pedantic -fbacktrace

Выход из gfortran:

matKBody(:) = (0.0_real64, 0.0_real64) 
       1 
Warning: Possible change of value in conversion from COMPLEX(8) to REAL(8) at (1) 

Таким образом, некоторые компилятором "знают" о таких вещах, и скажу вам, о них, если вы его попросите.

Как указано в комментариях, Fortran обеспечивает автоматическое преобразование между типами при назначении. Таким образом, это не ошибка, но gfortran, по крайней мере, предоставит предупреждение, чтобы программист мог проверить, предназначены ли они для преобразования. Вы можете подавить предупреждение и заявить свое намерение вызвать преобразование через:

matKBody(:) = real ((0.0_real64, 0.0_real64), real64) 

(Это просто пример, так как писать = 0.0_real64 так гораздо проще, для этого конкретного задания.)

Смежные вопросы