2016-04-12 12 views
2

ausführen Ist-es möglich, eine doppelte durchführen zu verlassen:Ausgang ein doppeltes

   PERFORM VARYING J FROM 1 BY 1 UNTIL J>10 
        PERFORM VARYING K FROM 1 BY 1 UNTIL K>3 
         IF J=2 and K=2 
         EXIT PERFORM 
         ELSE 
         display "LABEL A ===> PROCEDURE NOM_PROC2 " 
           "J=/"J"/ AND K=/"K"/" 
         END-IF 
        END-PERFORM 
       END-PERFORM 

ich mit EXITI versucht PERFORM, aber es funktioniert nicht für mich.

+0

Knall Gerade in einem 'GO TO'. Wer so etwas machen will, wird damit zufrieden sein. Denken Sie daran, die "EXIT PERFORM" ist nur ein GO TO, nur schlimmer, da es kein Label hat. Was versuchst du mit deinen Fragen zu tun? Schreiben Sie COBOL wie eine andere Sprache? Welche? –

+0

Ich denke, Sie müssen den echten Code zeigen, den Sie versuchen zu replizieren. Das ist vermutlich ein erfundenes Beispiel, wie @cshneid gezeigt hat. –

Antwort

1

Wie wäre:

DisplayLabel section. 
      PERFORM VARYING J FROM 1 BY 1 UNTIL J>10 
       PERFORM VARYING K FROM 1 BY 1 UNTIL K>3 
        IF J=2 and K=2 
        EXIT SECTION 
        ELSE 
        display "LABEL A ===> PROCEDURE NOM_PROC2 " 
          "J=/"J"/ AND K=/"K"/" 
        END-IF 
       END-PERFORM 
      END-PERFORM 
exit section. 

Rufen Sie den Displaylabel Abschnitt mit "perform Displaylabel"

+0

Nun, es würde funktionieren. Auch 'EXIT PARAGRAPH'. Ich würde es wirklich hassen, das in einem Programm zu sehen. Als nächstes brauchen wir eine Antwort "ALTER ... TO FORCE ...". –

+0

@Marcus Sundberg das Problem ist, dass diese doppelte führt bereits in einem Abschnitt –

+0

@MohamedELKHALIFI wenn das ist Ihr einziges Problem mit der Idee, legte sie in einem neuen Abschnitt. –

3

Wenn ich Ihre Frage richtig verstanden habe, wollen Sie sowohl in-line PERFORMs mit dem EXIT PERFORM verlassen. Die folgende Technik sollte funktionieren.

01 SWITCHES. 
    05 EOL-SW PIC X VALUE 'N'. 
     88 EOL  VALUE 'Y'. 
     88 NOT-EOL VALUE 'N'. 

SET NOT-EOL TO TRUE 
PERFORM VARYING J FROM 1 BY 1 UNTIL J>10 OR EOL 
    PERFORM VARYING K FROM 1 BY 1 UNTIL K>3 OR EOL 
     IF J=2 and K=2 
      SET EOL TO TRUE 
     ELSE 
      display "LABEL A ===> PROCEDURE NOM_PROC2 " 
        "J=/"J"/ AND K=/"K"/" 
     END-IF 
    END-PERFORM 
END-PERFORM 

Von einer vorherigen Frage haben Sie angegeben, dass Sie PL/I in COBOL transkribiert haben. Genau wie gesprochene und geschriebene Sprachen haben Computersprachen Idiome und Umgangssprachen, die sich nicht gut übersetzen lassen.

Ich glaube, dass dies logisch äquivalent ist.

PERFORM VARYING J FROM 1 BY 1 UNTIL J>2 
    PERFORM VARYING K FROM 1 BY 1 UNTIL K>2 
     display "LABEL A ===> PROCEDURE NOM_PROC2 " 
      "J=/"J"/ AND K=/"K"/" 
    END-PERFORM 
END-PERFORM 
1

Nutzen Sie die Kraft NACH variierender führt

perform varying j from 1 by 1 until j > 10 
     after k from 1 by 1 until k > 3 
      if j = 2 and k = 2 then 
       exit perform 
      else 
       display "j: " j ", k: " k 
      end-if 
    end-perform 

prompt$ cobc -xj exitnest.cob 
j: 01, k: 01 
j: 01, k: 02 
j: 01, k: 03 
j: 02, k: 01 
prompt$ 

COBOL 2014 (Entwurf) spec 14.9.27.2

10) At least six AFTER phrases shall be permitted in varying-phrase. 
+0

Hallo, Ich möchte Ihnen allen für Ihre Antworten danken. –

+0

@MohamedELKHALIFI Nun, Mohamed, auf StackOverflow kommt der Dank von Upvotes und schließt die Frage, indem er eine der Antworten als akzeptiert auswählt. Es muss nicht diese Antwort sein, aber SO-Nutzer fühlen sich alle besser, wenn Fragen eine akzeptierte Antwort erhalten. Es löscht die Warteschlange und lässt jeden wissen, dass die Dinge zufriedenstellend gelöst sind. –

0

Nun hat, wenn Ihr Original-Code ist PL/I und Ihre Aufgabe ist es nicht, die Struktur eines Programms zu ändern, wenn es vermieden werden kann, dann verwenden Sie GO TO.

PL/I kann aus einem DO verlassen mit einem STOP, RETURN (keiner von denen ist geeignet für Ihre Situation), LEAVE oder GOTO.

LEAVE label 

oder

GOTO label 

Sie würden entweder von denen ändern

GO TO label 

Und haben identische Ergebnisse. Sie müssen das vorhandene Label nicht ändern, außer für einen kleinen Unterschied in der Syntax, und müssen nicht einmal über irgendeinen Code nach dem Label nachdenken.

Wenn Sie die Struktur des Codes ändern können, haben Sie bereits zwei gute Antworten. Brian Tiffins ist der netteste, aber cschneeid's wird für die Mehrheit der COBOL-Programmierer, die nicht mehr als einmal auf demselben PERFORM wissen können, offensichtlicher sein.

+0

Dieser Kommentar machte mich innerlich ein wenig traurig, Bill. :-) 'PERFORM VARYING AFTER' ist jetzt über 30 Jahre alt. Erzähl mir nicht, dass COBOL-Programmierer in der Cargocult-Programmierung stecken bleiben; im Gras gegrabene Linien, Hütten mit Bambusantennen und Schaufensterpuppen mit Holzkopfhörern, in der Hoffnung, dass seltsame Alien-Technologie Süßigkeiten vom Himmel fallen lässt? Sag es ist nicht so. Wenn wir nicht alle in das 3. Jahrtausend ziehen können, nehmen wir zumindest an, dass die Mehrheit Mitte der 80er Jahre damit umgehen kann. Nein? (Ein anderer Smiley). –

+1

@BrianTiffin Sie sind gut mit VARYING, sie werden es sogar verwenden, wenn es eine bessere Alternative gibt, nur um zu vermeiden, dass Code/Denken. "AFTER" ist ihnen jedoch unbekannt. Ich habe nie gesehen oder gefragt nach 'Nachher'. Ich glaube nicht, dass das daran liegt, dass jeder es benutzt und es richtig benutzt. –

+0

Ahh ... zu träumen. –