Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fortran Goto (https://www.delphipraxis.net/163744-fortran-goto.html)

cltom 14. Okt 2011 10:08


Fortran Goto
 
Hej,

habe folgendes Fortran Schnipsel:

Delphi-Quellcode:
   10 DO 50 J=K,1,-1
         IF (R .EQ. 0) THEN

*snip*

            GOTO 10
         ENDIF
   50    CONTINUE
Kann mir jemand sage, wozu das Goto10 da steht? Nach Endif komme ich doch sowieso zum continue, oder übersehe ich da was?


danke und gruß
onsight

gammatester 14. Okt 2011 10:25

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.

cltom 14. Okt 2011 10:40

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:
   10 DO 50 J=K,1,-1
         IF (A .EQ. 0) THEN
*snip*
            ENDIF
            K = K-1
            GOTO 10
         ENDIF
   50    CONTINUE
Die Schleife wird ohnehin mit k-1 fortgesetzt, daher ist doch das goto überflüssig, oder?


Eine zweite Frage noch dazu: in Fortran ist es offenbar erlaubt, eine Schleifenvariable zwei mal zu verwenden, also:

Delphi-Quellcode:
do 100 i=1,n
  do 200 i=a,b
Welchen Wert hat i nach der Schleife von a bis b? wieder den Wert, den es davor hatte?

danke!

BoolString 14. Okt 2011 10:58

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

cltom 14. Okt 2011 11:07

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!

gammatester 14. Okt 2011 11:19

AW: Fortran Goto
 
Zitat:

Zitat von cltom (Beitrag 1130421)
Edit: nein, eigentlich macht es keinen Sinn:

Delphi-Quellcode:
   10 DO 50 J=K,1,-1
         IF (A .EQ. 0) THEN
*snip*
            ENDIF
            K = K-1
            GOTO 10
         ENDIF
   50    CONTINUE
Die Schleife wird ohnehin mit k-1 fortgesetzt, daher ist doch das goto überflüssig, oder?

Nein. Vereinfachtes Beispiel: Wir starten mit K=8 und für J=4 ist (immer) A=0. Dann haben wir folgende J-Werte
Code:
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
Dann ist die 50-er Schleife abgearbeitet.

BoolString 14. Okt 2011 11:38

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

cltom 14. Okt 2011 11:43

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?

cltom 14. Okt 2011 11:47

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

cltom 14. Okt 2011 12:05

AW: Fortran Goto
 
hätte es jetzt mal so versucht:
Delphi-Quellcode:
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;
da sollte doch das gleiche rauskommen, oder? danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz