Fortran имеет почти то же соглашение о вызовах, что и C, но со следующими отличиями:
- Все передается по ссылке: вам нужно передать address в процедуру fortran
- Порядок аргументов одинаков (выталкивается справа налево)
- Адрес возвращаемого значения необходимо помещать в стек после аргументов при вызове функции fortran (нефортран подпрограммы).В соответствующем прототипе C это равносильно объявлению функции void и дополнительному аргументу first , который является указателем на возвращаемое значение.
- Иногда вам необходимо добавить дополнительное подчеркиваниена имя Фортрана.Это требует некоторых экспериментов.
Например, если у вас есть рутина фортрана
subroutine ema(inarray,leninarray,n,outarray,lenoutarray)
она превращается в
void ema(double*, int*, int*, double*, int*)
или
void ema_(double*, int*, int*, double*, int*)
в зависимости от вашей машины.В C ++ вы хотите
extern "C" void ema(double*, int*, int*, double*, int*)
или
extern "C" void ema_(double*, int*, int*, double*, int*)
Не забывайте, что массивы fortran начинаются с 1, когда вы передаете индексы в подпрограммы.