Hab ein Problem mit f2c

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
speedy_81
Beiträge: 11
Registriert: 28.06.2006 19:09:37

Hab ein Problem mit f2c

Beitrag von speedy_81 » 28.06.2006 19:19:39

Hallo erstmal,
folgen des problem hab ich ich will ein Fortran 77 programm mit f2c in c konvertieren und dann debugen?
Aber wie geht das?
ich habe das probiert:

Code: Alles auswählen

f2c -g prog.f
gcc -g prog.c -o prog.out -lf2c -lm
cp prog.f prog.c
gdb prog.out
bis in gdb scheint alles zu klappen aber ich kann in gdb kein quelltext listen.

muß ich noch irgendwas installieren hab nur f2c installiert

wenn ich in gdb list eingebe kommt

Code: Alles auswählen

1    ../sysdeps/i386/elf/start.S: Datei oder Verzeichnis nicht gefunden 
in ../sysdeps/i386/elf/start.S
kann mir hier jemand weiter helfen ?
gibt es auc noch andere wege f2c programme zu debugen?
danke schon mal @all

Edit by Snoopy:
Code-Tags für die Leserlichkeit eingefügt.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 28.06.2006 21:02:25

Willkommen im Forum !

warum kopierst du "prog.f" auf "prog.c" ?

Code: Alles auswählen

root@gms1:~# cat x.f
      PROGRAM HELLO
      DO 10, I=1,10
      PRINT *,'Hello World'
   10 CONTINUE
      STOP
      END
root@gms1:~# f2c -g x.f
x.f:
   MAIN hello:
root@gms1:~# gcc -o x -g x.c -lf2c -lm
root@gms1:~# gdb x
GNU gdb 6.4.90-debian
......
(gdb) b MAIN__
Breakpoint 1 at 0x804851a: file x.f, line 5.
(gdb) r
Starting program: /root/x

Breakpoint 1, MAIN__ () at x.f:5
2             DO 10, I=1,10
Current language:  auto; currently fortran
(gdb) l
1             PROGRAM HELLO
2             DO 10, I=1,10
3             PRINT *,'Hello World'
4          10 CONTINUE
5             STOP
6             END
Was ist eigentlich der Vorteil von f2c gegenüber z.B. g77 bzw gfortran ?

Gruß
gms

speedy_81
Beiträge: 11
Registriert: 28.06.2006 19:09:37

Beitrag von speedy_81 » 28.06.2006 22:36:07

Danke für deine antwort .
Leider kann ich dir nicht sagen wo der vorteil ist, wir arbeiten im geschäft mit F2c und ich will meinen neuen kollegen die vorzüge eines debuggers aufweisen!
Die Firma arbeitet 15 Jahren mit F77 bzw F2c das meiste der NC/CAD Software ist in F77 geschreieben aber teils auch C un C++.

zu deiner frage warum ich das kopiere ich hatte im Netz eine anleitung unter DJGPP zum debuggen mit F2C und da war es so beschrieben.
Ich dachte bis dahin das die debug infos in der ausführbaren Datei schlummern

Deine anleitung Funktionier wunderbar aber warum kann ich in GDB ein C programm vor dem run LISTEN und das F77 prog. nicht? Und ist der breakpoint MAIN__ sozusagen die erkennung für f2c bzw f77 codedebugging?

Vielen dank noch mal!!!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 28.06.2006 23:02:31

speedy_81 hat geschrieben:aber warum kann ich in GDB ein C programm vor dem run LISTEN und das F77 prog. nicht?
Die Debuginfo im Binary verweist auf den C-Code, dieser C-Code enthält wiederum Verweise auf den Fortran Code. Diese Verweise schauen in etwa so aus::

Code: Alles auswählen

#line 5 "x.f"
Ich vermute, daß der Compiler erst an einen solchen Verweis geraten muß, damit der Fortran Code angezeigt wird.
speedy_81 hat geschrieben: Und ist der breakpoint MAIN__ sozusagen die erkennung für f2c bzw f77 codedebugging?
Ich habe im C Code nach einer einfachen Möglichkeit gesucht einen Breakpoint zu setzen und da ist mir diese MAIN__ Funktion untergekommen:

Code: Alles auswählen

/* Main program */ int MAIN__(void)
{
Diese Funktion wird anscheinend vom f2c als Hauptfunktion generiert, die eigentliche "main" Funktion, wie sie unter C üblich ist, ist anscheinend in der libf2c Library versteckt.


Gruß
gms

speedy_81
Beiträge: 11
Registriert: 28.06.2006 19:09:37

Beitrag von speedy_81 » 28.06.2006 23:14:45

ah sehr aufschlußreich.

Hast du beruflich mit der Sache hier zu tun oder ist das dein hobby, ich mein woher stammt dein großes wissen in diesem bereich?

Vielen dank nochmal!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 28.06.2006 23:42:01

Beruflich bin ich seit ca 22 Jahren 8O in der Softwareentwicklung tägig, (hauptsächlich C bzw C++ mit dem Spezialgebiet Datenbank- und OS- Portierung).

Mit Fortran habe ich überhaupt noch nichts getan, wir haben aber noch alten Cobol Code, der mittels OpenCobol auf C übersetzt wird. Auch dort gestaltet sich das Debuggen als nicht so einfach.
z.B. wenn du dir den Wert einer Variablen anschauen möchtest. In meinem Fortran Progrämmchen habe ich z.B den Zähler "I", die im C Code reingenerierte Variable heißt jedoch "i__".

Daher finde ich es eigentlich einfacher den C Code zu debuggen, lasse mir aber die entsprechenden Cobol-Statements als Kommentar in den C Code reingenerieren.

Das müßte beim "f2c" mit der Option "-c" und ohne der Option "-g" zu erreichen sein.

Gruß
gms

speedy_81
Beiträge: 11
Registriert: 28.06.2006 19:09:37

Beitrag von speedy_81 » 29.06.2006 22:00:49

wow 22 Jahre, da bin ich mit meinem 1/2 Jahre Softwareentwicklung und 1 jahr Praktkum dort woll erst am anfang meines Berufsleben!

Ja habe es ausprobiert das mit der Option -c funktioniert super allerdingst werden dann die variabeln wie du schon erwähnt hast umgeschrieben in z.b. i__ . Mit der option -g dagegen sind sie als z.b. i weiter abrufbar.
Aber das F2C - C ist für mich schwer verständlich aber mit den F77 komentaren gibt alles mehr sinn wie wenn man so drauf schaut!
Danke auch für diesen tip! :-)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 29.06.2006 22:31:54

speedy_81 hat geschrieben:Mit der option -g dagegen sind sie als z.b. i weiter abrufbar.
aja, dieses Feature kannte ich noch nicht. Das geht bei OpenCobol wahrscheinlich nicht, weil dort jede Variable als C-struct abgebildet wird.
Aber jedenfalls habe ich auch wieder etwas gelernt, so danke auch ich für diesen Tip! :)

Gruß
gms

speedy_81
Beiträge: 11
Registriert: 28.06.2006 19:09:37

Beitrag von speedy_81 » 29.06.2006 22:51:59

aber bei -g müsstest du dann auch auf C verzichten da wird nur F77 bei mir angezeigt und du sagtest ja das du lieber mit C arbeitest. aber ist schon komisch das der -c Modus die variable in i__ umdeklariert, wärend mit -g der alte name erhalten bleibt.
Gruß Speedy

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 29.06.2006 23:24:33

speedy_81 hat geschrieben:aber bei -g müsstest du dann auch auf C verzichten da wird nur F77 bei mir angezeigt und du sagtest ja das du lieber mit C arbeitest.
Da habe ich nicht an mich gedacht, wir haben aber auch reine Cobol Entwickler.
Auf Windows debuggen die natürlich mit einem richtigen Cobol Debugger, aber auf den Unix Platformen verwenden wir eben den OpenCobol Compiler und da sind sie leider auf meine Unterstützung angewiesen. Also irgendwie doch auch an mich gedacht :)
speedy_81 hat geschrieben: aber ist schon komisch das der -c Modus die variable in i__ umdeklariert, wärend mit -g der alte name erhalten bleibt.
dieses Verhalten habe ich so nicht reproduzieren können, er hat anscheinend etwas gegen eine Variable "i" :?

Code: Alles auswählen

root@gms1:~# grep DO x.f
      DO 10, J=1,10
root@gms1:~# sed -e 's/J/I/g' x.f > x2.f
root@gms1:~# grep DO x2.f
      DO 10, I=1,10
root@gms1:~# f2c -g x.f
x.f:
   MAIN hello:
root@gms1:~# f2c -g x2.f
x2.f:
   MAIN hello:
root@gms1:~# grep for x.c x2.c
x.c:    Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
x.c:    for (j = 1; j <= 10; ++j) {
x2.c:   Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
x2.c:    for (i__ = 1; i__ <= 10; ++i__) {

speedy_81
Beiträge: 11
Registriert: 28.06.2006 19:09:37

Beitrag von speedy_81 » 01.07.2006 22:36:16

Also so hab ich das gemacht und ich hab gesehen das F77 doch drin ist. Und du hast tatsächlich recht er hat es nur auf i abgesehen ein b wird normal dargestellt.
tss, sachen gibts die gibt es garnicht. :-)

gruß speedy

*@debian:~$ cd fzuc/
*@debian:~/fzuc$ ls
a.out hello hello.c hello.f hi.c ii.txt p1.c p1c.c p1.f prog x.c x.f
*@debian:~/fzuc$ gcc -g -o x x.c -lf2c -lm
*@debian:~/fzuc$ gdb x
GNU gdb 6.3-debian
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-linux"...Using host libthread_db library "/lib/libthread_db.so.1".

(gdb) b MAIN__
Breakpoint 1 at 0x804979a: file x.c, line 29.
(gdb) r
Starting program: /home/biedi/fzuc/x

Breakpoint 1, MAIN__ () at x.c:29
29 for (i__ = 1; i__ <= 10; ++i__) {
(gdb) l
24 /* Fortran I/O blocks */
25 static cilist io___2 = { 0, 6, 0, 0, 0 };
26
27
28 /*< DO 10, I=1,10 >*/
29 for (i__ = 1; i__ <= 10; ++i__) {
30 /*< PRINT *,'HELLO' >*/
31 s_wsle(&io___2);
32 do_lio(&c__9, &c__1, "HELLO", (ftnlen)5);
33 e_wsle();
(gdb)

Antworten