Обычное использование блоков в Фортране
Я новичок в Фортране и просто делаю некоторые простые вещи для работы. И, как новый программист в целом, не уверен точно, как это работает, поэтому извините, если мои объяснения или обозначения не самые лучшие. Вверху файла.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 с пользовательскими типами. Проверьте свою документацию на ТИП.