Фортран: как передать имя функции в общем блоке

Можно ли в Фортране поместить функцию в общий блок, например: COMMON / myblock / func (где x - некоторая переменная, а func - функция).

Моя проблема в том, что я хотел бы создать функцию s (x), которая вызывает внешнюю функцию func (x), но без передачи func в s (x). Для моего проекта s (x) должен быть функцией только одной переменной, т.е. я не хочу этого делать: function s (x, func) s = func (x)

Вместо этого я надеюсь, что смогу сделать: function s (x) common / myblock / func s = func (x)

Или, если у кого-то есть другие предложения по использованию модулей или чего-то еще, это будет здорово.

Заранее благодарю за любую помощь.

o.

а затем иметь такой же общий (myblock) в подпрограмме, которая вызывает s (x).


person Omo    schedule 22.05.2011    source источник
comment
Какой диалект Фортрана вы используете?   -  person talonmies    schedule 22.05.2011


Ответы (4)


Я не верю, что это возможно каким-либо портативным способом. Некоторые реализации могут позволить вам использовать некоторые уловки для этого.

person Ted Hopp    schedule 22.05.2011

Современный способ сделать это - указать на функцию. Указатель может быть передан в качестве аргумента или, в контексте этого вопроса, помещен в модуль. См., Например, Массивы указателей функций в Фортране

person M. S. B.    schedule 22.05.2011

Думаю, для этого нужно использовать не общие блоки, а модули. Поместите вашу функцию func в модуль с именем myfunctions, а затем при необходимости вставьте в оператор use myfunctions и все.

person John Alexiou    schedule 22.05.2011
comment
Это правильный ответ, если вопрос относится к Fortran 90/95/2003. Если это более старый диалект, это неверно. - person talonmies; 22.05.2011
comment
Спасибо всем. @ ja72: если я использую модули, как мне динамически изменять свою функцию? Помните, что «func» может изменяться при каждом вызове s (x). - person Omo; 22.05.2011
comment
Вот несколько полезных ресурсов для вас: macresearch.org/ cs.rpi.edu/~szymansk/OOF90/bugs.html - person Ben Hocking; 23.05.2011

Современные стандарты Fortran запрещают это. Из 5.5.2 Fortran 2003:

Объект общего-блока не должен быть ... именем функции, именем записи ...

И в любом случае использование глобальных переменных для передачи непостоянных данных - просто ужасная идея. Как указывает ja72, вы можете сделать это с помощью модулей, но я отказываюсь демонстрировать это на примере кода.

person Jonathan Dursi    schedule 22.05.2011