У меня есть числовой код, который мне нужно преобразовать в C или C++. Я пробовал использовать f2c, но он не работает с кодом Fortran. f2c жалуется, потому что в коде используются директивы препроцессора в стиле C (#include). В файле readme кода указано, что это Fortran77, который работает с компоновщиком fort77, который расширяет эти включения.
Кто-нибудь знает, как успешно преобразовать этот код?
Мое последнее средство - написать простой препроцессор для расширения этих включений, а затем передать код в f2c.
Примечание: здесь я работаю в среде Windows / Visual C++, поэтому любые махинации с gcc, вероятно, доставят больше проблем, чем они того стоят ...
На самом деле это хорошая шутка :-)
См. Это обсуждение: http://stackoverflow.com/questions/275458/conversion-of-fort ran-77-code-to-c
Этот возможно выходит из строя, но считали ли вы, что, поскольку, возможно, вы используете включения в стиле C, вы действительно могли бы запустить препроцессор C в файле, чтобы включить эти файлы? Затем вы можете взять вывод который и запустить его через f2c.
(Я не эксперт в этом вопросе. Если возможно, проголосуйте против.)
Хун ... Мне это тяжело. Но мой компилятор (Visual C++ 9.0) не отделен от препроцессора ... Или есть командная строка, чтобы указать это?
Вы можете использовать комбинацию параметров / C, / E и / P, подробности см. В msdn.microsoft.com/en-us/library/becb7sys(VS.71).aspx.
У вас нет препроцессора C? В Unix может существовать отдельная программа cpp, которая будет брать Фортран с директивами #include
и конвертировать его в Фортран без директив #include
. В качестве альтернативы вы можете переименовать источник с xyz.f77
(xyz.f
) в xyz.c
, затем запустить компилятор C в режиме «только препроцессор» и записать вывод как новый ввод для программы f2c
. Возможно, вам придется беспокоиться о параметрах, которые исключают директивы #line
в выводе и т. д., Или вам может быть лучше запустить вывод через простой фильтр (на ум приходят sed
или perl
).
Агин, как использовать этот режим только препроцессора в Visual C++ 9.0?
Вы можете обойтись без ручного преобразования
#include "whatsit.f90"
к
INCLUDE 'whatsit.f90'
а затем повторная попытка преобразования f2c.
Даже если это код Fortran 77 (поэтому расширение может быть .f77 вместо .f90). Конечно, стоит попробовать.
Кроме того, лучше, конечно, сделать преобразование автоматически. Несложный сценарий - вероятно, однострочный Perl.
Я много лет работал в группе инженерных исследований. Нам никогда не везло с автоматическим преобразованием из Фортрана в C. Код был не очень понятным, и его было трудно поддерживать. Нам больше всего повезло, что мы использовали код Fortran в качестве шаблона для алгоритма и выполняли повторную реализацию всего, что мы ожидали и дальше использовать. В качестве альтернативы вы можете обновить Fortran, чтобы использовать более современные конструкции Fortran и получить большую часть той же ценности, что и при переходе на C / C++. У нас также был некоторый успех при вызове подпрограмм Fortran из C, хотя различия в соглашениях о вызовах иногда усложняли задачу.
Я также обнаружил, что f2c имеет больше смысла как часть процесса сборки, чем для преобразования исходного кода для последующего редактирования людьми.
Старая шутка состоит в том, что инструмент unix "rm" конвертирует ваши устаревшие программы на Фортране в свободные блоки на диске, которые вы могли бы использовать для их правильной записи.