2016-04-10 4 views
0

Ich versuche, einen internen Eintrag in Cobol aufzurufen. Der Aufruf ist OK, aber das Problem, dass es einige Absätze nach dem Eintrag gibt, die auch falsch ausgeführt werden.Stoppen Sie den Effekt des Aufrufs eines Eintrags

Hier ist mein Programm:

IDENTIFICATION DIVISION. 
    PROGRAM-ID. ENTR1POW. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    LOCAL-STORAGE SECTION. 
    PROCEDURE DIVISION. 
    display "BEFORE CALL NOM_PROC1=======================" 
    PERFORM NOM_PROC1 THRU E--NOM_PROC1 
    display "AFTER CALL NOM_PROC1=======================" 
    display "CALL NOM_PROC2=============================" 
    PERFORM NOM_PROC2 THRU E--NOM_PROC2 
    display "CALL ENTRY1============================" 
    CALL 'ENTRY1' 
    GOBACK. 

    NOM_PROC1. 
     display "PGM ENTR1POW: BEGIN NOM_PROC1" 
     display "PGM ENTR1POW: END NOM_PROC1" 
     CONTINUE. 
    E--NOM_PROC1. 
     EXIT. 

    NOM_PROC2 SECTION. 
     display "PGM ENTR1POW: BEGIN NOM_PROC2" 

     ENTRY 'ENTRY1' 
     display "===========BEGIN ENTRY ENTRY1" 
     display "===========END ENTRY ENTRY1" 

     ENTRY 'ENTRY2' 
     display "===========BEGIN ENTRY ENTRY2" 
     display "===========END ENTRY ENTRY2" 

     ENTRY 'ENTRY3' 
     display "===========BEGIN ENTRY ENTRY3" 
     display "===========END ENTRY ENTRY3" 

     display "PGM ENTR1POW: END NOM_PROC2" 
     CONTINUE. 
    E--NOM_PROC2. 
     EXIT. 

    NOM_PROC3 SECTION. 
     display "PGM ENTR1POW: BEGIN NOM_PROC3" 
     display "PGM ENTR1POW: END NOM_PROC3" 
     CONTINUE. 
    E--NOM_PROC3 SECTION. 
     EXIT. 

    NOM_PROC4. 
     display "PGM ENTR1POW: BEGIN NOM_PROC4" 
     display "PGM ENTR1POW: END NOM_PROC4" 
     CONTINUE. 
    E--NOM_PROC4. 
     EXIT. 

Die Ausgabe, die ich erhalten:

BEFORE CALL NOM_PROC1======================= 
PGM ENTR1POW: BEGIN NOM_PROC1 
PGM ENTR1POW: END NOM_PROC1 
AFTER CALL NOM_PROC1======================= 
CALL NOM_PROC2============================= 
PGM ENTR1POW: BEGIN NOM_PROC2 
===========BEGIN ENTRY ENTRY1 
===========END ENTRY ENTRY1 
===========BEGIN ENTRY ENTRY2 
===========END ENTRY ENTRY2 
===========BEGIN ENTRY ENTRY3 
===========END ENTRY ENTRY3 
PGM ENTR1POW: END NOM_PROC2 
CALL ENTRY1============================ 
===========BEGIN ENTRY ENTRY1 
===========END ENTRY ENTRY1 
===========BEGIN ENTRY ENTRY2 
===========END ENTRY ENTRY2 
===========BEGIN ENTRY ENTRY3 
===========END ENTRY ENTRY3 
PGM ENTR1POW: END NOM_PROC2 
PGM ENTR1POW: BEGIN NOM_PROC3 
PGM ENTR1POW: END NOM_PROC3 
PGM ENTR1POW: BEGIN NOM_PROC4 
PGM ENTR1POW: END NOM_PROC4 

Ich denke, dass der Anruf auf die Absätze NOM_PROC3 und NOM_PROC4 dürfen nicht passieren.

+0

Ich kown, dass, wenn ich den Absatz NOM_PROC2 in das Ende des Programms verschoben, dann wird mein Problem gelöst werden, aber ich möchte das tun? Gibt es einen anderen Weg, um mein Problem zu lösen? Vielen Dank für Ihre Antwort. –

+0

Welchen Compiler benutzen Sie? Das ENTRY soll nicht in dem Programm sein, das es aufruft, es soll in einem anderen Programm sein. Was versuchst du zu machen? Wie @cschneid gesagt hat, ist ein "enthaltenes" oder "verschachteltes" Programm wahrscheinlich mehr, was Sie wollen. Sie werden sich auch verwirren, wenn Sie denken, dass ein PERFORM ein CALL ist. Es ist nicht, also sind die Nachrichten falsch. –

Antwort

2

Zuerst denken Sie hart bevor Sie ENTRY verwenden. In 30 Jahren Kodierung habe ich es in einem Programm, das in den frühen 1970ern geschrieben wurde, einmal getroffen und dort keinen nützlichen Zweck erfüllt. Betrachten Sie verschachtelte Programme, wenn Sie eine Notwendigkeit für ENTRY sehen. @BrianTiffin macht einen Fall für ENTRY in Nicht-Mainframe-Umgebungen in den Kommentaren.

Die Anweisung ENTRY erstellt einen alternativen Einstiegspunkt in Ihrem Code. Es ist nicht wie ein PERFORM. Sie müssen explizit von diesem alternativen Einstiegspunkt zurückkehren, so wie Sie von Ihrem Haupteinstiegspunkt zurückkehren. Dies geschieht typischerweise mit einer GOBACK Anweisung.

Ihr Programm verhält sich wie es sollte. Sie haben keine GOBACK nach der ENTRY 'ENTRY1' Anweisung, also wenn Sie CALL 'ENTRY1' Ihre Codeausführung fortfahren, bis es Ende des Programms trifft.

+0

Der Grund, dass ich Einträge verwende, ist nur, dass ich versuche, ein PL1-Programm zu migrieren, das Einträge enthält, und ich versuche, diesen Aspekt in meinen migrierten Programmen zu erhalten. –

+0

Schließlich externalise ich den Absatz, der die Einträge in ein Unterprogramm enthält, und es funktioniert für mich. –

+0

Ich möchte nur eine Sekunde hinzufügen. Für die GUI-Programmierung ist "ENTRY" eine mächtige Sache. Callbacks haben Zugriff auf den Status im Arbeitsspeicher. Es ist sehr praktisch für Dinge wie GTK + Button-Click-Handler und X11-Events usw. –

Verwandte Themen