2015-05-19 2 views
3

Я пытаюсь написать оболочку C для вызова набора функций в модуле Fortran. Я начинаю с чего-то основного, но я пропускаю что-то важное.C Wrapper Calling Fortran Функции

Я пробовал добавлять/добавлять разные числа символов подчеркивания. Я также пытался связать gcc вместо gfortran. То, что я покажу ниже, дает простейшую ошибку (ошибки).

Я работаю над Mac, работающим с Yosemite 10.10.3, GNU Fortran 5.1.0 и компилятором C, который поставляется с Xcode.

main.c

#include "stdio.h" 

int main(void) 
{ 
    int a; 
    float b; 
    char c[30]; 
    extern int _change_integer(int *a); 

    printf("Please input an integer: "); 
    scanf("%d", &a); 

    printf("You new integer is: %d\n", _change_integer(&a)); 

    return 0; 
} 

intrealstring.f90

module intrealstring 
use iso_c_binding 
implicit none 

contains 

integer function change_integer(n) 
    implicit none 

    integer, intent(in) :: n 
    integer, parameter :: power = 2 

    change_integer = n ** power 
end function change_integer 

end module intrealstring 

Вот как я компиляции, наряду с сообщением об ошибке:

$ gcc -c main.c 
$ gfortran -c intrealstring.f90 
$ gfortran main.o intrealstring.o -o cwrapper 
Undefined symbols for architecture x86_64: 
    "__change_integer", referenced from: 
     _main in main.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 
$ 
+1

ошибки предлагает ваш 32-битный и 64-битный код? – cjb110

+0

Всегда используйте тег [tag: fortran], используйте теги для отдельных версий, только если вы хотите подчеркнуть, что вам не нужна более новая стандартная версия. –

ответ

3

Вы должны связать Fortran -с:

module intrealstring 
use iso_c_binding 
implicit none 

contains 

integer (C_INT) function change_integer(n) bind(c) 
    implicit none 

    integer (C_INT), intent(in) :: n 
    integer (C_INT), parameter :: power = 2 

    change_integer = n ** power 
end function change_integer 

end module intrealstring 

Ваш с файлом модифицированных следующим образом:

#include "stdio.h" 

int change_integer(int *n); 

int main(void) 
{ 
    int a; 
    float b; 
    char c[30]; 

    printf("Please input an integer: "); 
    scanf("%d", &a); 

    printf("You new integer is: %d\n", change_integer(&a)); 

    return 0; 
} 

вы можете сделать:

$ gcc -c main.c 
$ gfortran -c intrealstring.f90 
$ gfortran main.o intrealstring.o -o cwrapper 
+0

Возможно, нет, C_INT лучше. Я отредактировал – LPs

+0

Спасибо, Владимир. Ваше решение работает. В функции Fortran change_integer параметр «power» является локальным. Является ли привязка к C по-прежнему необходимой или это просто хорошая практика программирования для привязки всех объявлений к C? – leoleson

+0

Думаю, вы задаете свой вопрос мне. Да, вы можете избежать привязки переменной мощности, потому что она локальна. Я всегда использовал привязки, когда пишу обертку. Это личное правило, чтобы не забывать привязки, где это обязательно. Задайте ответ как правильный, чтобы избежать других людей тратить время, пожалуйста. – LPs