Как выполнить подпрограмму, имя которой только что известно во время выполнения, в Fortran 90?

Предположим, у меня есть программа на Фортране с различными подпрограммами, я не знаю априори все подпрограммы, и пользователь вводит имя одной из них через командную строку следующим образом:

    program subroutine_name

Поэтому я сохраняю имя_подпрограммы в переменной character. Таким образом, я не могу объявить внешнюю переменную для хранения подпрограммы. Итак, как я могу назвать это, просто зная его имя? Возможно ли это таким образом, или есть другой способ сделать это?


person johncg    schedule 11.01.2013    source источник


Ответы (1)


На самом деле нет способа написать оператор Fortran, такой как

call character_variable_containing_subroutine_name

Такие возможности идут вразрез со статически типизированными компилируемыми языками, такими как Fortran.

Конечно, если бы вы спросили могу ли я предоставить входной аргумент программе на Фортране, который во время выполнения определит путь выполнения программы, тогда ответ будет конечно. Я проигнорирую любые осложнения вашей ситуации и предположу, что вы хотите позвонить одному из sin, cos или tan.

Сначала запишите текст аргумента программы в символьную переменную:

character(len=*) :: user_choice
...
call get_command_argument(1,user_choice)
...
select case (user_choice)
case ('sin')
   ... do stuff with sin
case ('cos')
   ... do stuff with cos
case ('tan')
   ... do stuff with tan
case default
   ... do whatever
end select

Вы можете сделать это более сложным, используя указатели процедур. Например, вы можете определить:

pointer :: rp
interface
 real function rp(inval)
    real, intent(in) :: inval
  end function rp
end interface

а затем замените первую версию конструкции select case чем-то вроде:

select case (user_choice)
case ('sin')
   rp => sin
case ('cos')
   rp => cos
case ('tan')
   rp => tan
case default
   ... do whatever
end select

Это может упростить последующий код. Я думаю, это также может сделать его более сложным.

Обратите внимание, что я не тестировал ни один из этих фрагментов, мой синтаксис может быть немного шатким.

person High Performance Mark    schedule 11.01.2013
comment
Здравствуйте, спасибо за ответ, я понял, что вы имели в виду. Для внутренних функций мне это совершенно ясно, так как я знаю их все, поэтому можно сделать выбор на основе пользовательского ввода, используя случай выбора, как показывает ваш пример. Но в моем случае пользователь написал собственную процедуру и скомпилировал ее вместе с моей программой. Затем я хотел бы знать, может ли пользователь выбрать любое имя для этой процедуры и передать это имя мне в качестве аргумента (например, в файле). Как вы ответили, это невозможно. Спасибо. - person johncg; 11.01.2013