![]() |
Fortran Goto
Hej,
habe folgendes Fortran Schnipsel:
Delphi-Quellcode:
Kann mir jemand sage, wozu das Goto10 da steht? Nach Endif komme ich doch sowieso zum continue, oder übersehe ich da was?
10 DO 50 J=K,1,-1
IF (R .EQ. 0) THEN *snip* GOTO 10 ENDIF 50 CONTINUE danke und gruß onsight |
AW: Fortran Goto
GOTO 10 startet die Schleife neu, CONTINUE würde sie ja nur fortsetzen.
Ob das sinnvoll ist oder ein Bug, kann man mit dem Gezeigten nicht beantworten. |
AW: Fortran Goto
ah, ok, das hast wohl recht. und ich fürchte, dass es auch Sinn macht, weil in dem ausgeschnippelten Teil die Variablen für die Schleife verändert werden (k wird verringert).
Edit: nein, eigentlich macht es keinen Sinn:
Delphi-Quellcode:
Die Schleife wird ohnehin mit k-1 fortgesetzt, daher ist doch das goto überflüssig, oder?
10 DO 50 J=K,1,-1
IF (A .EQ. 0) THEN *snip* ENDIF K = K-1 GOTO 10 ENDIF 50 CONTINUE Eine zweite Frage noch dazu: in Fortran ist es offenbar erlaubt, eine Schleifenvariable zwei mal zu verwenden, also:
Delphi-Quellcode:
Welchen Wert hat i nach der Schleife von a bis b? wieder den Wert, den es davor hatte?
do 100 i=1,n
do 200 i=a,b danke! |
AW: Fortran Goto
Eigentlich sollte so etwas nicht gehen/gemacht werden. Die Frage wäre ob evtl. noch etwas zwischen den beiden Do-Deklarationen steht.
So wären Konstrukte denkbar, mit denen man z.B. durch Verzeigung und dem 'Cycle' Argument die obere Schleife mehrfach durchlaufen läßt, bis eine Bedingung erreicht wird, und in der zweiten Schleife sichergestellt wird, daß hier nicht mehr drauf zurückgegriffen wird. Aber schön ist das nicht. Nur zum Interesse: Die Variablen liegen im Bereich 'a'..'n'. Entsprechend der alten Definition implizit eine Integer-Variable? Aus welchem Jahr/Compilergeneration kommt der Code? Jan |
AW: Fortran Goto
der Code ist alt, aus 1993, Fortran77
Sorry! Die Schleifenvariable ist nicht doppelt, das war mein Fehler. Die Wird nur zwei mal hintereinander genutzt ... das ist ein kreuz mit diesen Zeilennummern, wenn man da nicht aufpasst ... Die Frage mit dem Goto bleibt aber, danke! |
AW: Fortran Goto
Zitat:
Code:
Dann ist die 50-er Schleife abgearbeitet.
J=8,7,6,5,4 K=7
J=7,6,5,4 K=6 J=6,5,4 K=5 J=5,4 K=4 J=4 K=3 J=3,2,1 |
AW: Fortran Goto
Manchmal sieht man mehr, wenn man den Code vorliegen hat. Falls es dir möglich/erlaubt ist, kannst du ja vielleicht den Abschnitt mal zeigen...
Jan |
AW: Fortran Goto
Hmm, das macht Sinn. Vielen Dank!
Um das zu übersetzen ohne goto muss man da wohl eine neue Schleife drum herum packen, oder? |
AW: Fortran Goto
klar, hier mal der ganze teil, ist ja nicht so viel:
Code:
10 DO 50 J=K,1,-1
R = ZERO DO 20 I=1,K 20 IF (I .NE. J) R = R+ABS(MAT(J,I)) IF (R .EQ. ZERO) THEN SCAL(K) = J IF (J .NE. K) THEN DO 30 I=1,K 30 CALL SWAP(MAT(I,J),MAT(I,K)) DO 40 I=L,N 40 CALL SWAP(MAT(J,I),MAT(K,I)) ENDIF K = K-1 GOTO 10 ENDIF 50 CONTINUE |
AW: Fortran Goto
hätte es jetzt mal so versucht:
Delphi-Quellcode:
da sollte doch das gleiche rauskommen, oder? danke
while cont do
begin for j := k downto 1 do begin if r=0 then begin *snip* k:=k-1; cont := true; //kann man wohl auch weglassen end else cont := false; end; end; |
AW: Fortran Goto
Zitat:
Delphi-Quellcode:
j := k;
while j>=1 do begin {berechne r} if r=0 then begin k := k-1; j := k; continue; end; j := j-1; end; |
AW: Fortran Goto
Ja, das ist ein relativ altes Fortran-Projekt, das ich portieren werde.
Ich würde gerne diese gotos vermeiden, vor allem weil ich sie (augenscheinlich) nicht verstehe bzw. Fehler damit befürchte. Danke aber für Deinen Vorschlag, das wär natürlich deutlich kompakter. Hier bin ich aber noch am Abwägen, was besser ist: die Struktur des alten Programms weitgehend belassen, sodass der Vergleich beim Fehlersuchen leichter fällt. Oder möglichst alles modernisieren, damit es später bequemer wird. Zur Zeit hätt ich das Ding gern nur mal funktionierend übersetzt, weite Teile sind auch gut gemacht, sodass man nicht alles neu erfinden müsste (mal abgesehen davon, dass nix objektorientiert ist und es mit den globalen Variablendeklarationen natürlich ein Jubiläum gibt). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz