2013-07-26 3 views
4

Я пытаюсь получить доступ к переменным модуля в коде fortran, вызывая его из C. Я уже вызываю подпрограмму, но не могу вызвать переменные.доступ для данных модуля trtr из c с помощью gfortran и gcc

module myModule 
use iso_c_binding 
implicit none 
real(C_FLOAT) aa(3) 
contains 
subroutine fortranFunction() bind(C) 

print *,"hello world from Fortran 90" 
aa(1)=1.0; 
aa(2)=2.0; 
aa(3)=3.0; 

end subroutine 

end module 

и код С

#include "stdio.h" 

extern void fortranfunction(); 
extern float mymodule_aa_[3]; 

int main() 
{ 
printf("hello world from C\n"); 
fortranfunction(); 

printf("%f %f %f \n",aa[0],aa[1],aa[2]); 
return 0; 
} 

Я компиляции через

gcc -c ccode.c 
gfortran -c fortrancode.f90 
gcc fortrancode.o ccode.o -lgfortran -o myprogram 

, к которому НКУ реагирует с неопределенным ссылкой на `аа»

+0

Как проходит 'aa'? –

ответ

7

Использование objdump для посмотрите на символы, мы видим

0000000000000000 g  O .bss 000000000000000c __mymodule_MOD_aa 

Вам нужно добавить bind(C) в переменную аа

module myModule 
use iso_c_binding 
implicit none 
real(C_FLOAT), bind(C) :: aa(3) 
contains 
subroutine fortranFunction() bind(C) 

print *,"hello world from Fortran 90" 
aa(1)=1.0; 
aa(2)=2.0; 
aa(3)=3.0; 

end subroutine 

end module 

Теперь $ objdump -t fortrancode.o говорит

000000000000000c  O *COM* 0000000000000004 aa 

и

#include "stdio.h" 

extern void fortranfunction(); 
extern float aa[3]; 

int main() 
{ 
printf("hello world from C\n"); 
fortranfunction(); 

printf("%f %f %f \n",aa[0],aa[1],aa[2]); 
return 0; 
} 

и

$ ./myprogram 
hello world from C 
hello world from Fortran 90 
1.000000 2.000000 3.000000