gpt4 book ai didi

从 fortran 调用 C 函数

转载 作者:太空宇宙 更新时间:2023-11-04 03:55:39 27 4
gpt4 key购买 nike

我正在尝试使用 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
mat_'collect2: ld 返回 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。

关于从 fortran 调用 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16661531/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com