печать имени функции в фортране 90

Я написал код, который находит корень функции, имя которой указано среди аргументов, кажется, я взял его из Numerical Recipes. Что-то вроде

функция двойной точности rtsafe(x_init, x1, x2, xacc, func, dfunc)

где func и dfunc — имена двух функций. Конечно, я использую rtsafe с разными функциями func и dfunc. Я хотел бы напечатать имя вызываемых функций func и dfunc, когда я нахожусь внутри rtsafe, потому что, когда в rtsafe возникает ошибка, я хотел бы знать, какую функцию я использовал. Что-то вроде

write(,)"моя функция = ", функция

(?)

Кто-нибудь знает, как это сделать?


person simona    schedule 15.01.2012    source источник


Ответы (2)


Вы можете добавить в свои функции необязательный аргумент, который возвращает имя функции:

    FUNCTION f(x, fname) RESULT (fx)
      IMPLICIT NONE
      REAL                        :: x, fx
      CHARACTER(LEN=*), OPTIONAL  :: fname
      CHARACTER(LEN=*), PARAMETER :: myfname='somename'

      IF (present(fname)) fname=myfname

      fx = x   ! or whatever else

    END FUNCTION f

При первом вызове вашей функции в rtsafe вы получаете имя функции для последующей печати в случае ошибки.

Не проверял это, но это должно работать более или менее так, и это единственный способ, которым я могу придумать, чтобы сделать это на Фортране.

person s-h    schedule 20.06.2012

Может быть, вы можете разработать какое-то ручное решение (передать имя функции, а затем распечатать его с помощью «ОК» ... или что-то в этом роде), но напечатать имена функций/подпрограмм (отражение) невозможно.

person Rook    schedule 15.01.2012
comment
Не может ли он напечатать указатель на функцию? Я знаю, что в фортране нет указателей, но что-то подобное? В этом случае я мог бы написать таблицу указателей --› «имя функции». Имея указатель, я читал имя из таблицы. - person simona; 15.01.2012
comment
@simona - В фортране тоже есть указатели, но они не такие, как в C. При этом я действительно не могу сказать ... У меня никогда не было необходимости делать что-то подобное, так что говорить с головы до ног. Оставьте вопрос, здесь есть еще знающие люди, которые могут найти решение. Но на самом деле, разве вы не можете просто распечатать оператор управления после завершения функции или что-то очень простое - если это для цели, которую вы указали. - person Rook; 15.01.2012
comment
Я хотел бы печатать только в случае сбоя вызывающей функции rtsaf. Поскольку ошибка не является критической и выполнение продолжается, если я напечатаю управляющий оператор после завершения функции, я буду погружен в вывод из функции... - person simona; 15.01.2012
comment
ХОРОШО. Этот rtsafe представляет собой функцию поиска корневого каталога. Я нахожу корни функции func1 с помощью rtsafe, но func1 внутри вызывает другой экземпляр rtsafe, примененный к функции func2. - person simona; 16.01.2012
comment
rtsafe -> func1 -> rtsafe -> func2. Теперь сбой происходит, когда func не заключен в квадратные скобки, тогда rtsafe сообщает об ошибке и возвращает 0. это должно быть в порядке (?), когда это происходит с func2, потому что когда 0 возвращается внутри func1, это должно привести к неправильному значению на выходе func1 (скажем y), который затем отправляется в rtsafe. Идея состоит в том, что когда func1 возвращает y внутри rtsafe, это значение таково, что y!=0 и rtsafe отбрасывает его. - person simona; 16.01.2012
comment
Дело в том, что есть еще одна функция func3, которая определяется rtsafe-›func1-›rtsafe-›func2 и зависит от двух параметров. Теперь для некоторых значений этих параметров func1 и func2 не определены корректно, они возвращают nan или мусор, поэтому я должен держаться подальше от этих значений. Но если я ограничу диапазон параметров, то эти функции необратимы (без брекетинга), и мне нужно как-то плавно справиться с этим случаем. Может быть, это не лучший подход, но я все еще думаю, как его решить. Между тем я хотел бы понять, прав ли я, когда думаю, что брекетинг не работает в func2 - person simona; 16.01.2012