Chiamata C / C ++ sotto forma di codice di un programma FORTRAN in Visual Studio? (Come compilare misto C e il codice FORTRAN in Visual Studio)
-
01-10-2019 - |
Domanda
Sto cercando un modo, come posso integrare un codice C ++ con il codice FORTRAN (voglio semplicemente chiamare alcuni / C ++ funzioni C nel codice FORTRAN).
ho trovato alcune proposte di GCC o console compilatori, ma non ho alcuna idea di come tradurre questo approccio per risolvere integrationproblem all'interno dello studio visivo.
Al momento sto pensando di creare un codice di dll C ++ forma e chiamandolo dal codice Fortran.
Qualcuno ha già visto una soluzione? O quello che sta in testa per la funzione di chiamata da dll? I miei trasferimenti codice FORTRAN un sacco di memoria in funzione di C, c'è qualche problema, se mi piacerebbe risolvere questo problema con dll?
thx.
PS Sto usando Visual Studio 2008 Prof e Intel compilatori 10
PPS Penso, devo specificare più concreto, quello che voglio: voglio compilare un progetto FORTRAN in Visual Studio, che utilizza alcune funzioni C.
Soluzione
C'è un nuovo modo per fare questo che ha molti vantaggi - utilizzare il Fortran 2003 ISO C Binding. Questo è uno standard e quindi in gran parte del sistema operativo e il linguaggio modo indipendente da interfacciare Fortran e C (e qualsiasi linguaggio che utilizzerà C convenzioni di chiamata). Intel Fortran 11 supporta insieme a numerosi altri compilatori - non sono sicuro circa la versione 10. Utilizzando l'ISO C rilegatura, è possibile abbinare qualsiasi nome C (comunque), non devono preoccuparsi di sottolineatura (e variazioni tra compilatori) e può specificare i tipi e chiamare i metodi (con riferimento, per valore) per gli argomenti. Intel fornisce alcuni esempi di una cartella con il loro compilatore; ci sono anche esempi nel manuale gfortran e una discussione di ulteriori considerazioni per Windows. Ci sono domande e risposte precedenti qui e sul forum di Intel Fortran.
Altri suggerimenti
ho integrato C e Fortran circa 20 anni fa e mantenuto questa integrazione fino a 5 anni fa. I trucchi che ho usato sono:
- Ho notato che le mette compilatore Fortran tutti i simboli in maiuscolo, in modo da assicurarsi che le / C ++ funzioni C sono scritti in maiuscolo pure. Per verificare come i simboli sono messi nel file obj, uso DUMPBIN.
- Il compilatore Fortran non capisce il nome-pressare fatto dal compilatore C ++. Compilare tutte le tue funzioni C ++ utilizzando la convenzione di stile C (utilizzando extern "C")
- Argomenti a Fortran sono sempre messa in pila utilizzando i riferimenti / puntatori. Pertanto, l'uso del puntatore-argomenti nella vostra funzione C.
Per essere onesto, ho rinunciato integrando C e Fortran, quando sono passato a VS2005, quindi le cose potrebbero essere cambiate da allora. Tuttavia, è ancora una buona idea di utilizzare DUMPBIN per vedere che tipo di simboli del compilatore Fortran produce, e regolare la compilazione di C / C ++ fonti per adattarsi con quello.
Lo facciamo in cui lavoro.
Supponendo che si sta utilizzando il compilatore Intel Fortran, guardare in alto i suoi documenti. Per impostazione predefinita, Intel Fortran passa tutto per riferimento e (credo) utilizza la convenzione di chiamata C, con una tutte le protezioni identificatore. Le stringhe sono un tema particolare, come Fortran ama passare la lunghezza come parametro nascosto, con un ambiente compilatore per dove va nella lista dei parametri.
Un programmatore saggio non si basa su valori predefiniti (in cui un errore può portare a un comportamento indefinito), e utilizzare le istruzioni Intel INTERFACE
per specificare convenzione di chiamata, passaggio di parametri, e il nome del collegamento per la routine. Le informazioni contenute in questa pagina ( ATTRIBUTI Proprietà e convenzioni di chiamata) è una lettura obbligata. In particolare è necessario per capire le regole arcane di quando e dove verranno passati parametri di lunghezza della stringa. Ho una stampa di esso che tengo sulla mia persona. : -)
Un altra cosa da notare è che le versioni di VisualStudio ultimi 6 non lo fanno come progetti misti Fortran e C. Abbiamo risolto il problema con la creazione di file di progetto personalizzato gridano ai makefile, ma questo è una valle di lacrime. Io suggerirei di andare con il flusso e l'utilizzo di progetti separati a meno che non si sta facendo questo un molto come siamo.
soluzione trovata: collegamento soluzione
Ho avuto diversi problemi con il collegamento, che potrebbe essere risolto con l'aggiunta di proprietà del progetto.
Codice per il test:
#include <stdio.h>
extern "C"
{
void f()
{
printf("hi from c\n mega test");
}
}
codice FORTRAN
PROGRAM HelloWorld
use, intrinsic :: iso_c_binding
implicit none
interface
subroutine f( ) bind( c )
use, intrinsic :: iso_c_binding
end subroutine f
end interface
call f
END PROGRAM HelloWorld
su richiesta posso caricare il TestProject. ringrazia tutti, speriamo che era il mio ultimo problema con la C e FORTRAN
sono stato in grado di costruire obj da fonti FORTRAN grazie alle personalizzati strumenti di costruzione Visual espresso 2010. Credo che sia possibile anche in Visual Studio.
Se volete mescolare C e Fortran insieme, c'è un buon tutorial qui . È stato scritto per i compilatori GCC, ma si dovrebbe essere in grado di imparare a trattare con il nome pressare con facilità.
A seconda del compilatore, subroutine compilati / funzioni sono maiuscolo / minuscolo, con una sottolineatura finale, con una sottolineatura, ... Per un legame di successo, è possibile utilizzare strumenti dumpbin vedere come le viene visualizzato il nome del objectfile.
Un altro modo è quello di utilizzare i moduli iso_c_binding
, ma è disponibile con Fortran 2003 solo il.
Questo è il modo in cui funziona con gcc e console
ç.ç:
#include <stdio.h>
void f_()
{
printf("Hi from C\n");
}
fortran.f90
PROGRAM HelloWorld
CALL f
END PROGRAM HelloWorld
Makefile
SRCDIR=.
all: clean release run
release:
gcc -c c.c -o c.out
gfortran -c fortran.f90 -o fortran.out
gfortran -o out.exe fortran.out c.out
run:
out.exe
clean:
@$(ZSHMAGIC) rm -rf *.exe core* *.o a.out 2> /dev/null
Un altra domanda:? Ho sempre aggiungere '_' dopo il nome c-funzione, che io uso nel programma FORTRAN