Fortran-Unterprogramme in C einbinden

M

magjo

Grünschnabel
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.
 
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
 
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
 
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.
 
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
 
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.
schorsch312 schrieb:
Was heißt -Wall und -lgfortran -lstdc++ ?
Vielen Dank nochmal.
Gruß, Georg
-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.
 
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.
 
Zurück
Oben