Обычное использование блоков в Фортране

Я новичок в Фортране и просто делаю некоторые простые вещи для работы. И, как новый программист в целом, не уверен точно, как это работает, поэтому извините, если мои объяснения или обозначения не самые лучшие. Вверху файла.F есть общие объявления. Человек, объясняющий это мне, сказал, что думай об этом как о структуре в C, и что они глобальны. Также в том же самом файле.F они объявлены с каким типом. Так что это что-то вроде:

COMMON SOMEVAR

INTEGER*2 SOMEVAR

И затем, когда я на самом деле вижу, что он используется в каком-то другом файле, они объявляют локальные переменные (например, SOMEVAR_LOCAL) и в зависимости от условия устанавливают SOMEVAR_LOCAL = 1 или 0.

Затем есть еще одно условное условие, которое скажет что-то вроде

IF (SOMEVAR_LOCAL. eq. 1) 
SOMEVAR(PARAM) = 1;

(Опять же, я прошу прощения, если это не правильный Фортран, но у меня нет доступа к коду прямо сейчас). Таким образом, мне кажется, что есть переменная типа struct, называемая SOMEVAR, которая имеет некоторую длину (2 байта данных?), А затем есть локальная переменная, которая используется в качестве флага, так что в дальнейшем глобальный struct SOMEVAR может быть установлена ​​на это значение. Но поскольку существует (PARAM), это как массив для этого конкретного экземпляра? Благодарю. Извините за мои плохие объяснения, но, надеюсь, вы поймете, что я спрашиваю.

2 ответа

Решение

Первое объявление имеет SOMEVAR как скалярное целое число из двух байтов. Использование, которое вы показываете, имеет SOMEVAR имеет массив - на основе его индексации. Это возможно сделать в Фортране через "последовательность последовательности", но это плохая практика. В одном файле вы можете объявить SOMEVAR как INTEGER*2, и этому скаляру выделено два байта. В другом файле вы можете объявить его как INTEGER*1 SOMEVAR(2), и два байта зарезервированы, на этот раз для массива из двух элементов, каждый из которых по одному байту. Использование одного и того же общего блока в обоих файлах может привести к тому, что эти две переменные будут перекрываться, побайтово-последовательная связь. Много лет назад, когда памяти было очень мало, программисты делали это, чтобы уменьшить использование памяти, зная, что разные подпрограммы использовали переменные в разное время. Причины сделать это сегодня очень и очень ограничены. Главным образом не следует, потому что это может сбить с толку.

Вы также можете установить связь последовательности с помощью оператора EQUIVALENCE. Опять же, лучше избегать. Современной заменой временам, когда нужно делать "хитрые" вещи, для которых требовался оператор EQUIVALENCE, является функция TRANSFER.

Просто для усиления чего-то уже упомянутого @MSB: ОБЩИЕ блоки сообщают компилятору, как размещать переменные в памяти. Почти нет причин использовать их с современным Fortran, то есть с любым компилятором, который может работать с Fortran 90 или более поздней версией, и есть веские причины избегать их.

И добавим одно: в современном Fortran вы можете делать примерно то же, что и структуры C с пользовательскими типами. Проверьте свою документацию на ТИП.

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