2016-08-29 3 views
1

Я борюсь с кодом, который я получил от другого человека. Он использует модули для подачи массивов, которые необходимы основной рутине. Что мне нужно, это массив с номерами от 500 до 3500.Fortran: Как назначить значения в модуле

Он сделал это, написав

INTEGER :: i 
REAL :: myArray(3001) 

DATA (myArray(i),i=1,100)/& 
500., 501., 502., 503., [...] 599./ 

DATA (myArray(i),i=101,200)/& 
600., 601., [...], 699./ 

[...] 

DATA (myArray(i),i=2901,3001)/& 
[...] 3498., 3499., 3500./ 

Теперь мне это кажется очень сложным! Кроме того, мне нужно, чтобы myArray содержал целые числа, но, конечно, я не хочу удалять все эти точки.

Так сначала я попытался это:

Do i=1,3001 
    myArray(i) = i+499 
End Do 

Но я получаю

"Ошибка # 6274: Это утверждение не должно появиться в спецификации части модуля"

Что мне делать не так?

+0

Если вы не хотите иметь явную инициализацию (в смысле «во время компиляции», поэтому с помощью исполняемых инструкций), то ответы в [этом другом вопросе] (http://stackoverflow.com/q/30073737) подать заявление. Но действительно, [конструктор массива] (http://stackoverflow.com/documentation/fortran/996/arrays/6858/array-constructors#t=201608291552201114144) с подразумеваемым, чтобы получить явно инициализированный массив этого вида, не проблема , – francescalus

ответ

1

Ошибка вполне объяснительная. Вы не можете выполнять вычисления в модуле. Модуль предназначен для размещения указателей переменных и подпрограмм. У вас есть два варианта:

  • Просто объявить тип и размер вашего массива в модуле и инициализировать его в основной программе (с помощью модуля) с петлей вы предложили.

  • Или, как указано в @francescalus, вы можете напрямую использовать конструктор массива во время объявления в модуле. Что-то вроде этого: [(i, i=500, 3500)]

2

Вам нужен подразумеваемый цикл do. Это компилируется и работает нормально

MODULE module1 

    INTEGER :: i 
    REAL :: myArray(3001) = (/ (i, i=500, 3500) /) 

END MODULE 

Формат

(/ (exp1, var=start, end) /) 

или

(/ (exp1, var=start, end, step) /) 

или

(/ (exp1, expr2, .., var=start, end, step) /) 

См https://web.stanford.edu/class/me200c/tutorial_90/07_arrays.html

+5

Стоит упомянуть, что более современные стандарты Fortran ('03 on, если я правильно помню) позволяют '[' и ']' вместо '(/' и '/)'. –

+0

Спасибо. Вы можете сказать мой архаичный стиль из всех ключевых слов. Где-то рядом с F95 стало стандартным использовать все строчные буквы, и, наверное, я пропустил записку. – ja72

+0

Я пытаюсь найти ссылку для различных способов инициализации массивов в F03 и более поздних версиях. Его трудно найти. Раздел 3.16 ftp://ftp.nag.co.uk/sc22wg5/n1551-n1600/n1579.pdf - лучшее, что я мог бы сделать. – ja72

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