Как инициализировать массив целочисленного вида 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

Другие вопросы по тегам