Локализуйте диапазон общих блочных переменных в 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 вы можете создать пользовательский тип и создать переменную-массив этого типа. Затем вы передаете индекс элемента, с которым хотите работать. Пользовательский тип может быть сложной группой переменных. Переменная может быть аргументом подпрограммы или переменной модуля.