Как инициализировать массив целочисленного вида 8 в фортране?
Я хочу инициализировать массив больших целых чисел в Фортране, я попытался:
integer(kind=8) :: XGrid(1:20)
Но целые числа остаются по умолчанию вид =4. Как я позже добавлю числа в массив:
XGrid = (/3002, 3340403,....,19460630000/)
И я получаю ошибку "Эта числовая константа вне диапазона". Так как он не вписывается в вид =4 int, но будет в виде =8 int.
Я также попытался объявить это как:
integer, parameter :: ik8 = selected_int_kind(8)
integer(ik8) :: XGrid(1:20)
Но это тоже не сработало.
Редактировать: Спасибо Владимир Ф., но я пытаюсь определить массив, а не только одну переменную, и поэтому я не могу понять, как адаптировать ответ, используемый в: Есть ли лучшее назначение двойной точности в Fortran 90? Будет ли это:
integer, parameter :: ik8 = selected_int_kind(8)
integer(ik8) :: XGrid(1:20)_ik8
XGrid = (/3002_ik8, 3340403_ik8,....,19460630000_ik8/)
или это другое? Спасибо
2 ответа
Первый, kind=8
может быть что угодно, оно не должно быть 64-битным. Намного лучше использовать int64
от iso_fortran_env
вместо. Вы можете сделать свою собственную именованную константу с именем, например,
integer, parameter :: ìp = int64
Но что более важно,
(/3002, 3340403,....,19460630000/)
является выражением целочисленного массива по умолчанию, информация для которого не существует. =
назначение не имеет значения. Выражение не заботится о его контексте. Также есть ли лучшее назначение с двойной точностью в Fortran 90?
Вы должны указать вид
(/3002_8, 3340403_8,....,19460630000_8/)
или лучше
(/3002_int64, 3340403_int64,....,19460630000_int64/)
(или же _ip
)
Fortran 2003 также позволяет определять тип конструктора массива
[ integer(int64) :: ]
но это не поможет, каждая индивидуальная константа в выражении должна быть допустимой.
В дополнение к указанию KIND для каждого значения в массиве (как показано @Vladimir), вы можете использовать опцию компилятора, чтобы по умолчанию любые целые числа с неопределенным KIND имели длину 8 байт.
Например, с Intel Fortran для Windows это: /integer-size:64
или Linux: -integer-size 64
,
Я не пробовал, но в gfortran, похоже, есть похожая опция: -fdefault-integer-8