c++ взаимодействие с fortran

185
13 января 2019, 16:50

Как можно использовать фортран функций в С++?

Answer 1

Я как-то раз делал это на GCC, вот так:

(Позарез нужен был вот этот алгоритм, а переписывать на С++ не хотелось. Взял оригинальную реализацию на фортране, 197х года...)

Код на С++ и фортране компилируется обычным способом (для фортрана - компилятор gfortran, идет в комплекте с GCC), и линкуется в один файл.

В коде на С++ пишется прототип функции, обернутый в extern "C" {...}, который потом вызывается как обычно.

Имя функции в прототипе должно быть таким же, как в коде на фортране, но записанное в нижнем регистре, и с _ на конце.
Если вдруг такое имя не подходит (ошибка "undefined reference to ..."), то нужно применить objdump -t файл.o к объектному файлу, сделанному из кода на фортране, и найти нужное имя в списке функций.

Типы параметров для прототипа можно подобрать на глазок. Если никак не получается (программа вылетает или в функцию приходят неправильные значения), то придется читать мануалы к GCC и выяснять, какие типы из С++ и фортрана соответствуют друг другу.

В комментариях @avp подсказывает, что обычные числа (не массивы) в фортране передаются по ссылке, так что в C++ на их месте скорее всего нужно использовать указатели.

Никакие calling conventions мне указывать не потребовалось.

READ ALSO
Оптимизация алгоритма

Оптимизация алгоритма

Никак не могу выполнить задачу, заданную в ВУЗе - мой алгоритм не работает для больших значенийПодскажите какой-нибудь другой алгоритм для...

170
C++ Win API Как получить обьект из другого потока?

C++ Win API Как получить обьект из другого потока?

Создаю поток методом CreateThreadКак из основного потока получить доступ к обьекту созданому во втором потоке и вызвать его метод?

166
C/C++, отсутствие default в switch и UB

C/C++, отсутствие default в switch и UB

Подскажите, является ли отсутствие default в switch неопределенным поведением, если в switch попадает значение, для которого нет соответствующего...

179