Κλήση C κώδικα από FORTRAN

ψήφοι
0

Δεδομένης της Microsoft FORTRAN 5.1 και Microsoft C / C ++ 14,0, μαζί με το συνδετήρα που έρχεται με αυτή την έκδοση του FORTRAN (που πρέπει να χρησιμοποιείται για άλλες εξαρτήσεις) πώς μπορώ να δημιουργήσω μια συνάρτηση C και να το ονομάσουμε από την FORTRAN εφαρμογή;

Δημοσιεύθηκε 09/12/2008 στις 21:46
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
3

Υπάρχει ένα άρθρο στο MSDN με δείγμα κώδικα εδώ: FORTRAN κλήσεις προς C

Απαντήθηκε 10/12/2008 στις 00:37
πηγή χρήστη

ψήφοι
1

Έχετε δύο επιλογές.
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

Αυτό λειτουργεί w / gcc toolchain. Θα πρέπει να DUMPBIN στο 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/>

Η ελπίδα αυτό βοηθά

Απαντήθηκε 27/02/2009 στις 14:19
πηγή χρήστη

ψήφοι
0

Ίσως κάλλιο αργά παρά ποτέ. Θυμάμαι τη χρήση ms FORTRAN 5.1 με το Visual Studio 1. Δεν είμαι σίγουρος ποιο Visual Studio 14.0 ισοδυναμεί με, αλλά νομίζω ότι είναι σχετικά πρόσφατη και όχι 13 ετών. Νομίζω ότι αυτός ο συνδυασμός είναι ένα μη μίζα και 5.1 είναι ένα compiler 16bit για παράθυρα 3.

Απαντήθηκε 31/07/2009 στις 18:06
πηγή χρήστη

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