Fortran-Unterprogramme in C einbinden

Dieses Thema im Forum "C/C++" wurde erstellt von magjo, 27.03.2006.

  1. magjo

    magjo Grünschnabel

    Dabei seit:
    03.02.2005
    Beiträge:
    9
    Zustimmungen:
    0
    Hi
    ich hab das Problem das ich von einem Kollegen Unterprogramme in Fortran bekommen haben. Dies sind gut ausgetestete mathematische Routinen die ich gerne in mein C-Programm einbinden möchte. Die definition der Routinen in Fortran sieht folgendermaßen aus:

    Code:
    subroutine justr( nx, ny )
    Ich hab jetzt mit

    Code:
    f77 -c justr.f 
    ein Objekt-File erzeugt kriege es aber einfach nicht auf die Reihe die Unterprogramme in C einzubinden.

    Frage:
    Wie muss ich die Fortan-Routinen in C deklarieren?
    Oder muss ich die subroutinen in Fortran anderes definieren?

    Danke
    Joachim

    PS:
    Ich kann nicht besonders viel Fortran und mein Kollege kann kein C.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
  4. magjo

    magjo Grünschnabel

    Dabei seit:
    03.02.2005
    Beiträge:
    9
    Zustimmungen:
    0
    Hi

    Dankeschön, ein Unterstrich in der Deklaration hat gefehlt nun funktioniertes

    Es muss im C-Programm wie folgt heißen:

    Code:
    extern void justr[COLOR="Red"]_[/COLOR](int *nx, int *ny);

    Danke :))
    Joachim
     
  5. #4 schorsch312, 18.07.2006
    schorsch312

    schorsch312 Routinier

    Dabei seit:
    18.07.2006
    Beiträge:
    372
    Zustimmungen:
    0
    Hi,
    der Befehl
    g77 -c Name.f
    erzeugt die Datei Name.o .
    Die compilierte Fortran Datei liegt mit gleichem Namen im gleichen Verzeichnis.
    Wie binde ich die jetzt in meinen C-Code ein?

    Ich das Beispiel von der Seite
    http://www.ictp.trieste.it/~manuals/programming/sun/fortran/prog_guide/11_cfort.doc.html
    abgetippt und bekomme folgende Fehlermeldung.

    g++: c_calls_f: Datei oder Verzeichnis nicht gefunden
    c_calls_f.C: In function »int main()«:
    c_calls_f.C:5: Fehler: »fsim_« hat sowohl »extern« als auch Initialisierung
    c_calls_f.C:5: Fehler: Variable oder Feld »fsim_« als »void« deklariert
    c_calls_f.C:5: Fehler: »init« wurde in diesem Gültigkeitsbereich nicht definiert
    c_calls_f.C:5: Fehler: expected primary-expression before »float«
    c_calls_f.C:5: Fehler: initializer Ausdrucksliste als zusammengesetzten Ausdruck behandelt
    c_calls_f.C:6: Fehler: »fsim_« kann nicht als Funktion verwendet werden
    georg@schorsch:~/Documents/c++/DGA> mv fsim.o c_calls_f.o
    georg@schorsch:~/Documents/c++/DGA> g++ c_calls_f.C c_calls_f
    g++: c_calls_f: Datei oder Verzeichnis nicht gefunden
    c_calls_f.C: In function »int main()«:
    c_calls_f.C:5: Fehler: »fsim_« hat sowohl »extern« als auch Initialisierung
    c_calls_f.C:5: Fehler: Variable oder Feld »fsim_« als »void« deklariert
    c_calls_f.C:5: Fehler: »init« wurde in diesem Gültigkeitsbereich nicht definiert
    c_calls_f.C:5: Fehler: expected primary-expression before »float«
    c_calls_f.C:5: Fehler: initializer Ausdrucksliste als zusammengesetzten Ausdruck behandelt

    Der simple Quellcode ergibt sich zu:

    #include<iostream>
    int main(){
    int i=100;
    float r;
    extern void fsim_(init *i, float *r);
    fsim_(&i,&r);
    }

    Danke für eure Hilfe!
    Gruß, Georg
     
  6. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Schreib mal in der ++-Datei ueber dem
    'extern void fsim_...' ein 'extern "C"' hinzu.:
    Code:
    extern "C"
    extern void justr_(int *nx, int *ny);
    
    Dann kompilierst Du Dein Programm mittels
    Code:
    gcc -Wall fortran_datei.f cplusplus_datei.cpp -lgfortran -lstdc++
    
    (gfortran sollte dann installiert sein - weiss nicht, wie die entsprechende Bibliothek fuer g77 heisst. g2c vielleicht). So klappt's zumindest bei mir.
     
  7. #6 schorsch312, 18.07.2006
    schorsch312

    schorsch312 Routinier

    Dabei seit:
    18.07.2006
    Beiträge:
    372
    Zustimmungen:
    0
    Hi,
    Danke erst mal für die schnell Antwort.
    Kannst du mir bitte etwas ausführlicher erklären was ich da so machen soll, da ich gfortran nicht instaliert habe und ich nicht genau weiß, was ich mit dem Hinweis g2c anfangen soll.
    Mit deinem Aufruf kommt die Fehlermeldung:
    gcc -Wall c_calls_f.f c_calls_f.cpp -lgfortran -lstdc++

    gcc: c_calls_f.f: Fortran-Compiler ist auf diesem System nicht installiert
    c_calls_f.cpp: In function »int main()«:
    c_calls_f.cpp:5: Fehler: expected unqualified-id before string constant
    c_calls_f.cpp:7: Fehler: »fsim_« wurde in diesem Gültigkeitsbereich nicht definiert

    Ist klar, da gfortran nicht vorhandne ist.
    Was heißt -Wall und -lgfortran -lstdc++ ?
    Vielen Dank nochmal.
    Gruß, Georg
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  9. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Naja, wenn Du ein Fortran Programm kompilieren moechtest, brauchst Du eben auch einen Fortran-Kompiler dafuer.

    Du kannst fuer Fortran-77 Programme g77 oder gfortran benutzen. Fuer den Standard Fortran-90 und neuer musst Du gfortran benutzen.
    -Wall sagt dem Kompiler, dass er alle Warnungen ausgeben soll, auf die er stoesst.

    -lgfortran sagt dem Kompiler, dass er nach der Bibliothek libgfortran.a (statisch) oder libgfortran.so (dynamisch) suchen soll und die notwendigen Optionen zum Linken an den Linker weitergeben soll.

    Entsprechend sucht -lstdc++ nach der Bibliothek libstdc++.a oder libstdc++.so

    Ganz grob zumindest.
     
  10. Gohan

    Gohan Grünschnabel

    Dabei seit:
    19.08.2009
    Beiträge:
    2
    Zustimmungen:
    0
    Hallo, leute! Ich hbe auch fast das gleiche Problem. Ich versuche in mein C++ program eine eine Funktion zu verwenden, die in fortran impletiert ist. Doch diese Funktion,die ich mal funktion a1.f nenne, braucht eine schnittstelle a2.f, die erst implementiert werden soll. Nun moechte ich a2.f in c++ implementieren, um dann a1 uber dem Kommando extern "c"{void a1} zu benutzen. Leider weiss ich nicht, wie das geht und waere duer jeden Tipp dankbar.

    Peace, Gohan.
     
Thema:

Fortran-Unterprogramme in C einbinden

Die Seite wird geladen...

Fortran-Unterprogramme in C einbinden - Ähnliche Themen

  1. Kurztipp: Livestatus-Modul in Nagios einbinden

    Kurztipp: Livestatus-Modul in Nagios einbinden: Mit dem Livestatus-Modul lässt sich das Netzwerküberwachungssystem Nagios mit alternativen Frontends und anderer Software koppeln. Dieser Tipp...
  2. fstab: Netzlaufwerk beim Booten einbinden verursacht Fehler

    fstab: Netzlaufwerk beim Booten einbinden verursacht Fehler: Ich benutze davfs2, um ein WebDAV-Verzeichnis einzubinden. Wenn ich folgenden Eintrag in meine fstab schreibe, kann ich das Verzeichnis wunderbar...
  3. Deutsche Bundes-Gesetzgebung in LibreOffice einbinden

    Deutsche Bundes-Gesetzgebung in LibreOffice einbinden: Vor rund eineinhalb Jahren hat Stefan Wehrmeyer von der »Open Knowledge Foundation Germany« ein Git-Archiv angelegt, in dem er alle Bundesgesetze...
  4. Kann Raspberry nicht per Lan und statischer IP einbinden

    Kann Raspberry nicht per Lan und statischer IP einbinden: Hallo, ich hatte neulich das IP-Netz meines Heimnetzwerkes geändert (von x.x.178.x auf x.x.10.x). Heute musste ich auf meiner Raspberry (mit...
  5. Clementine Netzwerkordner einbinden?

    Clementine Netzwerkordner einbinden?: Hallo, gibt es eine Möglichkeit mit Clementine auch Musik von Netzwerkgeräten abzuspielen? Sprich ich habe einen Media Player der ganz Normal...