Chamando o código C do Fortran

votos
0

Dada Microsoft Fortran 5.1 e Microsoft C / C ++ 14,0, juntamente com o vinculador que vem com essa versão do Fortran (que deve ser usado para outras dependências) como faço para criar uma função C e chamá-lo a partir da aplicação Fortran?

Publicado 09/12/2008 em 21:46
fonte usuário
Em outras línguas...                            


3 respostas

votos
3

Há um artigo no MSDN com código de exemplo aqui: Fortran chama a C

Respondeu 10/12/2008 em 00:37
fonte usuário

votos
1

Você tem duas opções.
1) que pode mostrar com o Exemplo

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

Isso funciona w / conjunto de ferramentas gcc. Você vai ter que DUMPBIN no código objeto DLL e Fortran para ver se os nomes correspondem corretamente.
A outra forma é semelhante:

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

comando de compilação

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

Espero que isto ajude

Respondeu 27/02/2009 em 14:19
fonte usuário

votos
0

Talvez seja melhor tarde do que nunca. Lembro-me usando ms Fortran 5.1 com visual studio 1. Não estou certo de que o Visual Studio 14.0 é equivalente a, mas eu acho que é relativamente recente e não 13 anos de idade. Eu acho que essa combinação é um non starter como 5,1 é um compilador de 16 bits do Windows 3.

Respondeu 31/07/2009 em 18:06
fonte usuário

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