Вызов С-кода из Фортрана - PullRequest
       15

Вызов С-кода из Фортрана

0 голосов
/ 09 декабря 2008

Учитывая Microsoft FORTRAN 5.1 и Microsoft C / C ++ 14.0, а также компоновщик, который поставляется с этой версией FORTRAN (которая должна использоваться для других зависимостей), как мне создать функцию C и вызвать ее из приложения FORTRAN?

Ответы [ 3 ]

3 голосов
/ 10 декабря 2008

Здесь есть статья на MSDN с примером кода: Фортран звонит на C

1 голос
/ 27 февраля 2009

У вас есть два варианта.
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 &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

Это работает с набором инструментов 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/>

Надеюсь, это поможет

0 голосов
/ 31 июля 2009

Возможно, лучше поздно, чем никогда. Я помню, как использовал MS Fortran 5.1 с Visual Studio 1. Я не уверен, что Visual Studio 14.0 эквивалентна, но я думаю, что это относительно недавно и не 13 лет. Я думаю, что эта комбинация не для начинающих, поскольку 5.1 - это 16-битный компилятор для Windows 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...