1

我正在尝试使用 fortran 调用 C 函数(项目需要这个)。因此,首先尝试通过 fortran 简单地调用一个非参数化的 void 函数。

请帮助我解决给定代码中的以下错误。

矩阵乘法的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;
 }

另外,我写的从fortran调用函数mat的代码是:

  program mat_mult  !This is a main program.

  call mat()
  stop
  end

在执行 C 文件时,我收到以下错误:

matrix_mult.c:5:错误:预期标识符或字符串常量前的“(”

使用 F77 编译器执行 fortran 文件时,出现以下错误:

/tmp/ccQAveKc.o:在函数MAIN__': matrix_mult.f:(.text+0x19): undefined reference tomat_'collect2:ld 返回 1 退出状态

请帮助我识别错误/正确代码。谢谢你。

4

1 回答 1

1

先说几件事

1) 我假设您使用的是 C99 编译器,因为您编写的 C 代码不适用于 C89 编译器。

2) extern "C" 用于 C++ 程序:不是 C 程序。

不太确定您使用的是哪个编译器。假设您使用的是 gcc 和 gfortran,因为它看起来像是在基于 Linux 的系统上。

gcc 只是在符号前添加了一个 _:所以 mat 变成了 _mat。gfortran 将前导和尾随 _ 添加到符号中:因此 mat 变为 _mat _。

让 C 和 Fortran 对话

a) 从 C 代码中删除 main 函数

b) 删除 extern "C" 声明。这是一个 C++ 声明,它告诉编译器例程 mat 不应该有任何名称修饰。

c) 由于您没有任何参数,因此只需假设_cdecl 并将 void mat() 更改为 void mat ()。如果必须使用stdcall,则需要使用--enable-stdcall-fixup 进行编译。如果 Fortran 程序必须将参数传递给 C 程序,则需要 stdcall ,但这是另一回事。编译器生成 mat@0 而不是 _mat_

d) 你的 C 例程现在看起来像

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

/* No main */

e) 由于例程 mat 没有在 Fortran 代码中声明,编译器需要知道它是外部的。

program mat_mult
external mat
call mat()
stop
end

f) 编译和链接(比如 C 程序称为 mat.c,fortran 程序称为 matmul.f)

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

可能会有一大堆评论建议您使用 F2003 或 F2008,但如果您被告知必须使用 F77,那么您必须使用 F77。

于 2013-05-26T21:23:38.087 回答