Способ сделать это сейчас - использовать привязку Fortran ISO C на стороне Fortran.Это является частью стандарта языка Fortran 2003 и доступно во многих компиляторах;это не специфично для gcc.Это было описано во многих ответах на этом сайте.Как часть языкового стандарта, он не зависит от компилятора и платформы.И вам не нужно знать о внутренних условных обозначениях компилятора.Привязка ISO C, когда она используется в объявлении подпрограммы или функции Fortran, заставляет компилятор Fortran использовать соглашения о вызовах C, чтобы эту процедуру можно было напрямую вызывать из C. Вам не нужно добавлять скрытые аргументы или имяНазвание фортрановой подпрограммы, т.е. без подчеркивания.Имя, используемое компоновщиком, происходит из опции «bind».
Строки - сложный случай, потому что технически в C они являются массивами символов, и вы должны соответствовать этому в Fortran.Вы также должны иметь дело с различными определениями строк: C завершен нулем, Fortran фиксированной длины и дополнен пробелами.Пример показывает, как это работает.Числа проще.Единственная проблема, связанная с массивами, заключается в том, что C является главным и основным столбцом Fortran, поэтому многомерные массивы транспонируются.
int main ( void ) {
char test [10] = "abcd";
myfortsub (test);
return 0;
}
и
subroutine myfortsub ( input_string ) bind ( C, name="myfortsub" )
use iso_c_binding, only: C_CHAR, c_null_char
implicit none
character (kind=c_char, len=1), dimension (10), intent (in) :: input_string
character (len=10) :: regular_string
integer :: i
regular_string = " "
loop_string: do i=1, 10
if ( input_string (i) == c_null_char ) then
exit loop_string
else
regular_string (i:i) = input_string (i)
end if
end do loop_string
write (*, *) ">", trim (regular_string), "<", len_trim (regular_string)
return
end subroutine myfortsub
Вы компилируете C вобъектный файл и используйте gfortran для компиляции фортрана и связывания обоих:
gcc-mp-4.6 \
-c \
test_fortsub.c
gfortran-mp-4.6 \
test_fortsub.o \
myfortsub.f90 \
-o test_fortsub.exe
Вывод:
>abcd< 4