Обратите внимание на ошибку «Константа вне диапазона», а не «Переменная вне диапазона». Константа в строке
integer(kind=7) :: num = 600851475143
является фактическим числом: 600851475143. По умолчанию ваш компилятор, кажется, хочет хранить константы как 32-битные целые числа, и это число слишком велико для этого.
Самым простым решением было бы указать компилятору хранить эту константу в том же виде, что и num
, так что что-то вроде этого:
integer(kind=7) :: num = 600851475143_7
Это завершающее подчеркивание указывает компилятору хранить константу как целое число типа 7.
НО
Я должен указать, что какое число соответствует какому типу, зависит от компилятора и машины. Это значит, что код нельзя было бы легко передать.
Поэтому, пожалуйста, используйте одну из этих конструкций:
Для более новых компиляторов (совместимых с Fortran 2008) используйте встроенный модуль iso_fortran_env
:
program PEU3
use iso_fortran_env, only: int64
implicit none
integer(kind=int64) :: num = 600851475143_int64
Для более старых компиляторов вы можете использовать метод selected_int_kind
, чтобы найти лучший целочисленный тип. Он принимает один параметр: максимальное количество цифр (по основанию 10) для хранения. (Хотя технически, если вы передадите ему число 12, это гарантирует только числа между -10^12 ... 10^12
, поэтому вам нужно будет передать 13, чтобы быть уверенным, что ваш номер может быть сохранен.)
integer, parameter :: largeint = selected_int_kind(13)
integer(kind=largeint) :: num = 600851475143_largeint
Оба эти метода легче читаются и не зависят от компилятора, поэтому их гораздо легче портировать на новую систему.
person
chw21
schedule
17.08.2018
kind=7
вам гарантировано, что ваш ode не будет скомпилирован практически любым другим компилятором. Пожалуйста, не используйте магические константы для добрых чисел, см. stackoverflow.com/questions /838310/fortran-90-вид-параметр - person Vladimir F   schedule 19.08.2018