2013-05-21 4 views
1

Я пытаюсь вызвать функции C, используя fortran (это нужно для проекта). Итак, сначала попытался просто вызвать не параметризованную функцию void через fortran.Вызов функций C из fortran

Просьба помочь мне устранить следующие ошибки в данном коде.

C Код для матричного умножения:

#include <stdio.h> 


extern "C" 

{ void __stdcall mat(); 
} 


void mat() 
{ 
int m, n, p, q, c, d, k, sum = 0; 

    printf("Enter the number of rows and columns of first matrix\n"); 
scanf("%d%d", &m, &n); 

    int first[m][n]; 

    printf("Enter the elements of first matrix\n"); 

    for ( c = 0 ; c < m ; c++) 
    for (d = 0 ; d < n ; d++) 
    scanf("%d", &first[c][d]); 

    printf("Enter the number of rows and columns of second matrix\n"); 
    scanf("%d%d", &p, &q); 

    int second[p][q]; 

if (n != p) 
    printf("Matrices with entered orders can't be multiplied with each other.\n"); 
else 
{ 
    printf("Enter the elements of second matrix\n"); 

    for (c = 0 ; c < p ; c++) 
    for (d = 0 ; d < q ; d++) 
    scanf("%d", &second[c][d]); 

    int multiply[m][q]; 

    for (c = 0 ; c < m ; c++) 
{ 
    for (d = 0 ; d < q ; d++) 
    { 
    for (k = 0 ; k < p ; k++) 
    { 
     sum = sum + first[c][k]*second[k][d]; 
    } 

    multiply[c][d] = sum; 
    sum = 0; 
    } 
} 

    printf("Product of entered matrices:-\n"); 

    for (c = 0 ; c < m ; c++) 
    { 
    for (d = 0 ; d < q ; d++) 
     printf("%d\t", multiply[c][d]); 

    printf("\n"); 
    } 
} 

} 

    int main() 
{ 
mat(); 
return 0; 
} 

Кроме того, код для вызова функции циновки из фортрана, что я написал это:

program mat_mult !This is a main program. 

    call mat() 
    stop 
    end 

Исполняя файл C, я получаю следующее сообщение об ошибке :

matrix_mult.c: 5: ошибка: ожидаемый идентификатор или '(' перед строковой константой

Исполняя Фортран файл, используя F77 компилятор, я получаю следующее сообщение об ошибке:

/tmp/ccQAveKc.o: В функции MAIN__': matrix_mult.f:(.text+0x19): undefined reference to mat_» collect2: л.д. возвращается статус 1 выхода

Пожалуйста, помогите мне в определении ошибки/правильного кода. Спасибо.

ответ

1

Несколько наперво

1) Я предполагаю, что вы используете C99 компилятор, так как код C, вы написали не будет работать на C89 компилятор.

2) extern «C» предназначен для программ на C++: не C-программ.

Не уверен, какой компилятор вы используете. Предположим, вы используете gcc и gfortran, так как похоже, что вы находитесь в системе на базе Linux.

gcc просто добавляет ведущее _ к символам: так что мат становится _mat. gfortran добавляет как символы, так и символы перед символом: так что мат становится _mat _.

Для C и Fortran говорить

а) Снимите основную функцию из кода C

б) Удалить Экстерн "C" заявление. Это декларация C++, которая сообщает компилятору, что в цикле подпрограммы не должно быть никакого имени.

c) Поскольку у вас нет каких-либо параметров, просто предположите _ cdecl и смените void mat() на void mat(). Если вам нужно использовать stdcall, вам нужно скомпилировать с помощью --enable-stdcall-fixup. stdcall понадобится, если программа Fortran должна передать параметры программе C, но это другая игра с мячом. Вместо _mat _, компилятор генерирует мат @ 0

d) Ваш C рутина будет выглядеть как

#include <stdio.h> 
void mat_() 
{ 
    ... 
} 

/* No main */ 

е) Поскольку процедура мат не объявлен в Fortran кода, компилятор должен знать что он является внешним.

program mat_mult 
external mat 
call mat() 
stop 
end 

е) Обобщение и связь (скажем, программа C называется mat.c и Фортран программа называется matmul.f)

gcc -g -c mat.c 
gfortran -g matmul.f mat.o -o matmul 

Там, вероятно, будет весь груз комментариев рекомендовав вы используете F2003 или F2008, но если вам сказали, что вам нужно использовать F77, вам нужно использовать F77.

Смежные вопросы