鉴于 Microsoft FORTRAN 5.1 和 Microsoft C/C++ 14.0,以及该版本 FORTRAN 附带的链接器(必须用于其他依赖项),我如何创建 C 函数并从 FORTRAN 应用程序调用它?
rck
问问题
4256 次
3 回答
3
MSDN 上有一篇文章,这里有示例代码: FORTRAN calls to C
于 2008-12-09T23:37:21.917 回答
1
你有两个选择。
1)我可以举例说明
FORTRAN
program ftest
use iso_c_bindings
implicit none
interface
function saythis(a) ! should be subroutine if saythis returns void
import :: c_ptr
type(c_ptr), value :: a
end function saythis
end interface
character(len=80), target :: str
type(c_ptr) cstr
integer :: r
str='Hello World From Fortran' // C_NULL_CHAR
cstr=c_loc(str(1:1))
r=saythis(cstr)
C/C++
#ifdef __cpluscplus
#include <l;cstdio>
using namespace std;
#else
#inlcude <stdio.h>
#endif
#ifdef __GNUC__
#define FORT(func) func ## _
#else
#define FORT(func) __stdcall func ## _
#endif
#ifdef __cpluscplus
extern "C" {
#endif
__declspec(dllexport) int FORT(sayit)(char* c)
{
return printf("%s\n",c);
}
#ifdef __cpluscplus
}
#endif
这适用于 / gcc 工具链。您必须对 DLL 和 fortran 目标代码进行转储,以查看名称是否正确匹配。
另一种方式类似:
//This is for gcc toolchain
//you'll have to find the symbol conversion yourself
//I think that Visual Studio converts fortran names
//to ALL CAPS so instead of func => _func you'll need func => FUNC
FORTRAN
program ftest
integer aa,bb,cc
common/vari/aa,bb,cc
aa=7
bb=11
cc=0
call dosomething
call dosomethingelse(aa,bb,cc)
C/C++
#ifdef __cplusplus
extern "C" {
#endif
int _dosomething();
int _dosomethingelse(int*,int*,int*); //all fortran is pass by reference
struct { int aa,bb,cc; } vari;
#ifdef __cplusplus
}
#endif
//function def's go here
//struct vari should be the same memory as common/vari block
编译命令
$>g++ -c ctest.c <br/>
$>gfortran -c ftest.f90 <br/>
$>gfortran *.o -lstdc++ -o test_prog <br/>
希望这可以帮助
于 2009-02-27T13:19:04.570 回答
0
也许迟到总比没有好。我记得在 Visual Studio 1 中使用过 ms fortran 5.1。我不确定哪个 Visual Studio 14.0 相当于,但我认为它是相对较新的,而不是 13 岁。我认为这种组合不是入门的,因为 5.1 是 Windows 3 的 16 位编译器。
于 2009-07-31T17:06:50.293 回答