-
CALL-Programme als CALLP
Moin,
uns stören die hin und wieder vorkommenden CALL-Aufrufe aus Programme im Free-RPG, mit und auch ohne Parameter.
Ich würde gerne wissen ob und welche einfachen Möglichkeiten es gibt den CALL durch CALLP zu ersetzen, damit Free nicht verlassen werden muss?
-
Du legst für Programme genau wie für Prozeduren Prototypen und Procedure Interfaces an.
Das Procedure Interface ersetzt die *ENTRY PLIST, der Prototyp wird in alle Quellen aus denen das Programm aufgerufen wird in den globalen D-Bestimmungen als Copy-Strecke eingebunden.
Ebenso muss der Prototyp in der Quelle, in der auch das Procedure Interface (im eigentlichen Programm also) eingebunden werden.
Im Prototypen muss für Programme das Schlüssel-Wort EXTPGM('PROGRAMM') angegeben werden.
... und dann kann der Aufruf mit CALLP erfolgen (bzw. CallP ist im Free Format nur erforderlich, wenn eine Erweiterung z.B. (E) benötigt wird.)
Birgitta
-
Ich habe das wohl nicht verständlich genug geschrieben. Die Programme die aufgerufen werden existieren bereits alle. Alte Programme mit PLIST.
Oder verstehe ich das richtig, dass ich nicht drumherum komme das Programm, welches ich aufrufen möchte auf eine Prozedur zu ändern?
-
Vielleicht habe ich mich auch nicht verständlich ausgedrückt:
Du benötigst lediglich Procedure Interface und Prototyp. Von einer Umwandlung in eine Prozedur habe ich nicht gesprochen.
Damit der Kompiler zwischen Programm und Prozedur unterscheiden kann, muss bei Programm-Prototypen das Schlüssel-Wort EXTPGM angegeben werden.
Birgitta
-
Ah okay.
Sprich Interface und Prototyp erstellen, damit diese aus den Free-Programmen verwendet werden können.
Das Interface wiederum ruft dann das alte Programm auf.
Korrekt?
-
Hallo,
hier ein kleines Beispiel:
PHP-Code:
DPGMR2 PR EXTPGM('XXXXXR2')
D Mode CONST LIKE(ParmSel)
D Season CONST LIKE(SLSSEA)
Callp Aufruf
PHP-Code:
CALLP PGMR2(02 :aSaison)
Gruß
Michael
-
Ein Prototyp wird im rufenden Programm definiert, das Interface im gerufenen Programm (ersetzt den *ENTRY).
-
Moin,
Zitat von mk
PHP-Code:
DPGMR2 PR EXTPGM('XXXXXR2')
D Mode CONST LIKE(ParmSel)
D Season CONST LIKE(SLSSEA)
Callp Aufruf
PHP-Code:
CALLP PGMR2(02 :aSaison)
da haben wir wieder einen typischen Fall von zu kompliziert gedacht. So einfach ist das also.
Zitat von Fuerchau
Ein Prototyp wird im rufenden Programm definiert, das Interface im gerufenen Programm (ersetzt den *ENTRY).
Aber das gerufene Programm muss kein Interface haben oder? So wie das Beispiel von mk.
Habe ich selbst gerade ausprobiert und es ging ohne. Es gab sogar die Rückgabe.
Gruß
-
Ein Interface ersetzt den *ENTRY!
Achtung bei der Parameterdefinition.
CONST bedeutet, dass der Compiler zusätzlichen Code generiert um die Übergabe zuerst in interne Variablen zu kopieren und dann zu übergeben.
Solltest du Antwort in einem Parameter erwarten, darfst du CONST nicht verwenden, da du ja an die interne Kopie nicht drankommst.
CONST ist dann sinnvoll, wenn man als Parameter eine feste Definition hat aber mit variablen Parametern ohne vorherigen Move/Eval arbeiten möchte oder verhindern möchte, dass das gerufene Programm meine Parameter verändert.
-
Zitat von Fuerchau
Ein Interface ersetzt den *ENTRY!
Ja das habe ich verstanden. Die Frage ist: Muss ich den *ENTRY ersetzen oder kann ich es?
Bei dem Test den ich gemacht habe, wird ein altes Programm, welche *ENTRY beinhaltet, aufgerufen und es hat funktioniert. Daher würde ich sagen, ich muss *ENTRY nicht durch ein Interface ersetzen.
Zitat von Fuerchau
Achtung bei der Parameterdefinition.
CONST bedeutet, dass der Compiler zusätzlichen Code generiert um die Übergabe zuerst in interne Variablen zu kopieren und dann zu übergeben.
Solltest du Antwort in einem Parameter erwarten, darfst du CONST nicht verwenden, da du ja an die interne Kopie nicht drankommst.
CONST ist dann sinnvoll, wenn man als Parameter eine feste Definition hat aber mit variablen Parametern ohne vorherigen Move/Eval arbeiten möchte oder verhindern möchte, dass das gerufene Programm meine Parameter verändert.
Das hatte ich auch so gedacht. So kannte ich CONST bislang.
Testweise habe ich versucht das alte Programm mit einer Prozedur ohne CONST und einer Prozedur mit CONST aufzurufen. Es kommt in beiden Fällen allerdings dasselbe dabei heraus.
Kann es sein, dass CONST nur das ändern der Parameter verhindert, wenn es im Interface verwendet wird?
Und wird es im Prototypen verwendet bedeutet es lediglich, dass Parameter durch Referenz übergeben werden dürfen? (Siehe Beispiel mk)
-
Parameter an externe Programme können immer nur als Referenz übergeben werden, Value funktioniert nur bei Prozeduren und Funktionen.
Const verhindert nicht das verändern der Parameter im gerufenen Programm sondern gibt die Veränderung nicht zurück.
Interface und *ENTRY sind nur unterschiedliche Compiler-Directiven, zur Laufzeit gibts da keinen Unterschied.
-
Okay. Das hab ich soweit. Danke erstmal dafür.
Zitat von Fuerchau
Const verhindert nicht das verändern der Parameter im gerufenen Programm sondern gibt die Veränderung nicht zurück.
Dazu aber noch eine Frage.
Folgendes Beispiel:
PHP-Code:
DPGM1 PR extpgm('PGM1')
D EXT_VAR1 1A const
D EXT_VAR2 2A const
D EXT_VAR3 3A const
D VAR1 S 1A
D VAR2 S 2A
D VAR3 S 3A
VAR3 = 'XYZ';
PGM1(VAR1:VAR2:VAR3);
PGM1 kann VAR3 jetzt zwar auf 'ABC' ändern, es kommt aber nicht zurück, sondern es steht weiterhin 'XYZ' drin?
Ich habe das mit einem Programm mit *ENTRY getestet und der Wert wird verändert, obwohl die Variable im Prototyp auf CONST steht.
Es macht natürlich keinen Sinn den Wert der sich verändern soll als Konstante (im Beispiel: PGM1(VAR1:VAR2:'XYZ')) zu übergeben. Dann kann die Veränderung ja in keine Variable geschrieben werden.
Similar Threads
-
By steven_r in forum NEWSboard Programmierung
Antworten: 7
Letzter Beitrag: 01-07-08, 15:33
-
By dino in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 17-01-07, 09:23
-
By hh-mi in forum IBM i Hauptforum
Antworten: 5
Letzter Beitrag: 15-11-06, 12:23
-
By edig in forum NEWSboard Programmierung
Antworten: 10
Letzter Beitrag: 14-07-06, 15:48
-
By jajonowak in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 12-06-06, 13:55
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks