混合编程:从C调用FORTRAN

混合编程:从C调用FORTRAN,c,linker,fortran,g77,C,Linker,Fortran,G77,我必须做一个从C/C++调用FORTRAN子程序的概念证明。 我不知道我在正确的方向,请引导我 我所做的是 我编写了以下FORTRAN代码 INTEGER*4 FUNCTION Fact (n) INTEGER*4 n INTEGER*4 i, amt amt = 1 DO i = 1, n amt = amt * i END DO Fact = amt END SUBROUTINE Pythagoras (a, b, c) REAL*4 a REAL*4 b REAL*4 c c = SQ

我必须做一个从C/C++调用FORTRAN子程序的概念证明。 我不知道我在正确的方向,请引导我

我所做的是

我编写了以下FORTRAN代码

INTEGER*4 FUNCTION Fact (n)
INTEGER*4 n
INTEGER*4 i, amt
amt = 1
DO i = 1, n
amt = amt * i
END DO
Fact = amt
END

SUBROUTINE Pythagoras (a, b, c)
REAL*4 a
REAL*4 b
REAL*4 c 
c = SQRT (a * a + b * b)
END
使用g77作为
g77.exe-c FORTRANfun.for

我写了下面的c代码

#include <stdio.h>

extern int __stdcall FACT (int n);
extern void __stdcall PYTHAGORAS (float a, float b, float *c);

main()
{
    float c;
    printf("Factorial of 7 is: %d\n", FACT(7));
    PYTHAGORAS (30, 40, &c);
    printf("Hypotenuse if sides 30, 40 is: %f\n", c);
}

大部分时间都是因为符号的缘故

f77 comiler标志“-fno下划线”和“-fno第二下划线”将改变对象代码中的默认命名,从而影响链接。可以使用命令nm(即:nm file.o)查看对象文件

注意:FORTRAN中的大小写不保留,在目标文件中用小写字母表示。g77编译器选项“-fsource case lower”是默认值。GNU g77 FORTRAN可以使用编译选项“-fsource case preserve”区分大小写


请参阅

大多数情况下,这是由于符号大小写造成的

f77 comiler标志“-fno下划线”和“-fno第二下划线”将改变对象代码中的默认命名,从而影响链接。可以使用命令nm(即:nm file.o)查看对象文件

注意:FORTRAN中的大小写不保留,在目标文件中用小写字母表示。g77编译器选项“-fsource case lower”是默认值。GNU g77 FORTRAN可以使用编译选项“-fsource case preserve”区分大小写

请参阅Zeeshan顶部的

,您必须使用指针将变量传递给Fortran:

extern int __stdcall fact(int* n);
extern void __stdcall pythagoras(float* a, float* b, float *c);
在Zeeshan之上,您必须使用指针将变量传递给Fortran:

extern int __stdcall fact(int* n);
extern void __stdcall pythagoras(float* a, float* b, float *c);

这可能是由于不同的符号情况。由于不保留大小写,GNU Fortran在编译时默认将所有符号映射为小写。尝试
extern int\uu stdcall事实(int n)=90。77国集团多年来一直没有得到支持。看看Fortran ISO_C_绑定。作为Fortran 2003的一部分,作为语言的一部分,它提供了一种从Fortran(或从C)指定调用C的方法。stackoverflow上有一个标记:fortran-iso-c-binding这可能是由于不同的符号大小写。由于不保留大小写,GNU Fortran在编译时默认将所有符号映射为小写。尝试
extern int\uu stdcall事实(int n)=90。77国集团多年来一直没有得到支持。看看Fortran ISO_C_绑定。作为Fortran 2003的一部分,作为语言的一部分,它提供了一种从Fortran(或从C)指定调用C的方法。stackoverflow上有一个标签:fortran-iso-c-Binding在执行此操作后,经常会意识到他无法再调用代码中调用的众多fortran库。执行此操作后,经常会意识到他无法再调用代码中调用的众多fortran库。太棒了!!!。。。谢谢,在Zeeshan的回答后,我被撞车了。现在它工作得很好。。。非常感谢!!!杰出的谢谢,在Zeeshan的回答后,我被撞车了。现在它工作得很好。。。非常感谢!!!