Der Aufruf von C-Code aus Fortran

stimmen
0

In Anbetracht Microsoft FORTRAN 5.1 und Microsoft C / C ++ 14.0, zusammen mit dem Linker, der mit dieser Version von Fortran kommt (das muss für andere Abhängigkeiten verwendet werden), wie erstelle ich eine C-Funktion und rufe sie von der Fortran-Anwendung?

Veröffentlicht am 09/12/2008 um 21:46
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
3

Es ist ein Artikel auf MSDN mit Beispielcode hier: Fortran zu C - Aufrufe

Beantwortet am 10/12/2008 um 00:37
quelle vom benutzer

stimmen
1

Sie haben zwei Möglichkeiten.
1) Ich kann zeigen , mit Beispiel

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 &ltl;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

Dies funktioniert w / gcc - Toolchain. Sie müssen auf dem DLL und Fortran - Objektcode dumpbin zu sehen , ob die Namen richtig zusammenpassen.
Der andere Weg ist ähnlich:

//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

Kompilierungsbefehl

$>g++ -c ctest.c <br/>
$>gfortran -c ftest.f90 <br/>
$>gfortran *.o -lstdc++ -o test_prog <br/>

Hoffe das hilft

Beantwortet am 27/02/2009 um 14:19
quelle vom benutzer

stimmen
0

Vielleicht besser spät als nie. Ich erinnere mich ms Fortran 5.1 mit Visual Studio 1. Ich bin nicht sicher, was Visual Studio 14.0 entspricht, aber ich denke, es ist relativ neu ist und nicht mehr als 13 Jahre alt. Ich denke, dass diese Kombination ein nicht-Starter ist als 5.1 ein 16-Bit-Compiler für Windows 3 sind.

Beantwortet am 31/07/2009 um 18:06
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more