Question
Étant donné Microsoft FORTRAN 5.1 et Microsoft C / C ++ 14.0, ainsi que l'éditeur de liens fourni avec cette version de FORTRAN (qui doit être utilisé pour d'autres dépendances), comment créer une fonction C et l'appeler à partir de l'application FORTRAN?
La solution
Vous avez deux choix.
1) Je peux montrer avec un exemple
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
Ceci fonctionne avec une chaîne d’outils gcc. Vous devrez dumpbin sur la DLL et le code d'objet fortran pour voir si les noms correspondent correctement.
L’autre moyen est similaire:
//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
COMMANDE COMPILE
$>g++ -c ctest.c <br/>
$>gfortran -c ftest.f90 <br/>
$>gfortran *.o -lstdc++ -o test_prog <br/>
J'espère que cela vous aidera
Autres conseils
Il existe un article sur MSDN avec un exemple de code ici: Appels FORTRAN en C
Peut-être mieux tard que jamais. Je me souviens d’avoir utilisé MS Fortran 5.1 avec Visual Studio 1. Je ne sais pas exactement à quoi Visual Studio 14.0 équivaut, mais je pense que c’est relativement récent et non âgé de 13 ans. Je pense que cette combinaison est un non-démarreur car 5.1 est un compilateur 16 bits pour Windows 3.