2017-01-03 12 views
1

Я хочу, чтобы инициализировать массив больших целых чисел в Fortran, я попытался:Как инициализировать массив целочисленного типа 8 в fortran?

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) 

Но это тоже не сработало.

Edit: Спасибо Vladimir F, но я пытаюсь определить массив, а не только одной переменной и как таковой, я не могу понять, как адаптировать ответ, используемый в: Is There a Better Double-Precision Assignment in Fortran 90? Будет ли это быть:

integer, parameter :: ik8 = selected_int_kind(8) 
integer(ik8) :: XGrid(1:20)_ik8 
XGrid = (/3002_ik8, 3340403_ik8,....,19460630000_ik8/) 

или это другое? Спасибо

ответ

6

Во-первых, kind=8 может быть любым, он не обязательно должен быть 64-битным. Гораздо лучше использовать int64 от iso_fortran_env. Вы можете сделать свою собственную названную константу с именем, например

integer, parameter :: ìp = int64 

Но что еще более важно,

(/3002, 3340403,....,19460630000/)

это выражение массив целого числа по умолчанию нет информации, чтобы сделать вид 8. Что перед тем задание = не имеет значения. Выражение не заботится о его контексте. Se также Is There a Better Double-Precision Assignment in Fortran 90?

Вы должны указать любезное

(/3002_8, 3340403_8,....,19460630000_8/)

или лучше

(/3002_int64, 3340403_int64,....,19460630000_int64/)

(или _ip)

Fortran 2003 также позволяет определить тип конструктор массива

[ integer(int64) :: ] 

но это не поможет здесь, каждая индивидуальная константа в выражении должна быть законной.

+0

спасибо, вот большую помощь –

+0

@Vladimir: Что о '(/3002.d0, 3340403.d0 ,. ..., 19460630000.d0 /) '? Является ли это эквивалентным/переносным? – Coriolis

+0

@Ian: Извините, я имею в виду, если массив реален. Если я использую 'integer, parameter :: real64 = SELECTED_REAL_KIND (15,307)' как тип точности, эквивалентен ли запись '3002.d0' и' 3002_real64'? – Coriolis

0

В дополнение к указанию KIND для каждого значения в массиве (как показано на рисунке @Vladimir), вы можете использовать параметр компилятора, чтобы по умолчанию любые целые числа с неуказанным KIND будут иметь длину 8 байтов.

Например, с Intel Fortran в Windows это: /integer-size:64, или Linux: -integer-size 64.

Я не пробовал, но, как представляется, подобный вариант в gfortran: -fdefault-integer-8

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

  • Нет связанных вопросов^_^