Llamando al código C de FORTRAN

votos
0

Dado Microsoft FORTRAN 5.1 y Microsoft C / C ++ 14.0, junto con el enlazador que viene con esa versión de FORTRAN (que debe usarse para otras dependencias) ¿cómo creo una función C y la llamo desde la aplicación FORTRAN?

Publicado el 09/12/2008 a las 21:46
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
3

Hay un artículo en MSDN con código de ejemplo aquí: FORTRAN llama a C

Respondida el 10/12/2008 a las 00:37
fuente por usuario

votos
1

Tienes dos opciones.
1) Puedo mostrar con el ejemplo

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

Esto funciona con la cadena de herramientas gcc. Tendrás que volcar en la DLL y en el código de objeto fortran para ver si los nombres coinciden correctamente.
La otra forma es similar:

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

COMPILAR EL COMANDO

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

Espero que esto ayude

Respondida el 27/02/2009 a las 14:19
fuente por usuario

votos
0

Tal vez mejor tarde que nunca. Recuerdo usar ms fortran 5.1 con visual studio 1. No estoy seguro de qué visual studio 14.0 es equivalente, pero creo que es relativamente reciente y no tiene 13 años. Creo que esta combinación no arranca ya que 5.1 es un compilador de 16 bits para Windows 3.

Respondida el 31/07/2009 a las 18:06
fuente por usuario

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