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)

StackOverflow https://stackoverflow.com/questions/3135296

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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top