Локализуйте диапазон общих блочных переменных в Fortran 77

Я работаю над этим кодом F77 с широким использованием COMMON BLOCKS, и эти COMMON BLOCKS также используются в программе на C (после искажения имени). Если foo(a, b, ...) является основной подпрограммой кода на фортране, можно ли в любом случае сделать ОБЩИЕ БЛОКИ локальными для foo(), чтобы я мог сделать что-то вроде следующего?

program new_control_routine()

...
call foo(a1,b1,...)
...
call foo(a2,b2,...)
...
end

Смысл в том, чтобы иметь несколько вызовов "foo", каждый из которых имеет независимые ОБЩИЕ БЛОКИ, даже если они имеют одинаковые имена. Единственный способ, который я знаю, - это переименовать ОБЩИЕ БЛОКИ и связанные подпрограммы во втором вызове "foo", чтобы он стал другой подпрограммой "foo1", так что я могу сделать:

programe new_control_routine()
...
call foo(a1,b1,...)
...
call foo1(a2,b2,...)

Но это, конечно, обыденно и подвержено ошибкам.

1 ответ

Суть общих блоков в том, что они являются глобальными, доступными для любой подпрограммы, использующей их имя. Не могли бы вы сделать переменные в массивах общих блоков и передать индекс, чтобы ваши разные вызовы обращались к разным элементам?

Зачем ограничивать себя Фортраном 77? С Fortran 95/2003 вы можете создать пользовательский тип и создать переменную-массив этого типа. Затем вы передаете индекс элемента, с которым хотите работать. Пользовательский тип может быть сложной группой переменных. Переменная может быть аргументом подпрограммы или переменной модуля.

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