Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Produktion von Anwenderroutinen in C

&pagelevel(3)&pagelevel

Eine C-Anwenderroutine, die nur aus einer Source produziert wird, kann ohne Bindeschritt als LLM in einer Bibliothek abgelegt werden. Der EDT gibt beim Laden der Anwenderroutine einen Resolve-Kontext an, der die benötigten Laufzeitmodule enthält.

Der genaue Mechanismus ist abhängig davon, ob der EDT von einem C-Hauptprogramm mit ILCS-Flag initialisiert wurde oder nicht:
Wenn dies der Fall ist, werden Anwenderroutinen in einen eigenen Ladekontext EDT#USER geladen und als Resolve-Kontext werden EDT#CRTS und LOCAL#DEFAULT (in dieser Reihenfolge) angegeben. Folglich werden Externverweise auf die C-Globals in der Anwenderroutine zuerst gegen die Entries aus EDT#CRTS (EDT-Laufzeitumgebung) und dann gegen die Entries aus LOCAL#DEFAULT (C-Hauptprogramm) abgesättigt.
Da eine (dynamisch nachgeladene) Anwenderroutine immer in der EDT-Laufzeitumgebung aufgerufen wird, werden der Anwenderroutine dadurch die richtigen C-Globals zur Verfügung gestellt, unabhängig davon, ob das C-Hauptprogramm seinerseits sichtbare Entries für die C-Globals hat.
Der eigene Ladekontext für die Anwenderroutine muss berücksichtigt werden, wenn aus der Anwenderroutine heraus weitere Module dynamisch mit BIND nachgeladen werden sollen.

Wenn das C-Hauptprogramm den EDT ohne ILCS-Flag initialisiert hat, wird die Anwenderroutine aus Kompatibilitätsgründen in den Ladekontext LOCAL#DEFAULT geladen und als Resolve-Kontext wird EDT#CRTS angegeben. In diesem Fall sollte das C-Hauptprogramm keine sichtbaren Entries auf die C-Globals haben, sonst majorisieren diese die entsprechenden Entries der EDT-Laufzeitumgebung und die Anwenderroutine kann nicht korrekt mit C-Bibliotheksfunktionen arbeiten.

Die folgende Prozedur compiliert und bindet C-Anwenderroutinen, die als ANWEND1.C, ANWEND2.C, ... in der Bibliothek EDT.BEISPIELE abgelegt sind.
Der erzeugte LLM, die Compiler-Listen und die Diagnose-Ausgabe werden ebenfalls in dieser Bibliothek abgelegt:

/SET-PROCEDURE-OPTIONS INPUT-FORMAT=FREE-RECORD-LENGTH,/
    DATA-ESCAPE-CHAR=STD
/BEGIN-PARAMETER-DECLARATION
/   DECLARE-PARAMETER NAME=NR
/   DECLARE-PARAMETER NAME=LIB,INITIAL-VALUE=C'EDT.BEISPIELE'
/END-PARAMETER-DECLARATION
/START-CPLUS-COMPILER
//MODIFY-SOURCE-PROP LANGUAGE=*C
//MODIFY-RUNTIME-PROPERTIES PARAMETER-PROMPTING=*NO
//MODIFY-INCLUDE-LIBRARIES USER-INCLUDE-LIBRARY=//
    $.SYSLIB.EDT.170                   ------------------------------ (1)
//MODIFY-DIAGNOSTIC-PROPERTIES OUTPUT=*LIBRARY-ELEMENT(//
    LIB=&LIB,ELEM=*STD-ELEMENT()),-
//    MIN-MSG-WEIGHT=*NOTE
//MODIFY-MODULE-PROPERTIES LOWER-CASE-NAMES=*YES,- 
//    SPECIAL-CHARACTERS=*KEEP           ------------------------------ (2)
//MODIFY-LISTING-PROPERTIES OUTPUT=*LIBRARY-ELEMENT(//
    LIB=&LIB,ELEM=*STD-ELEMENT()),SOURCE=*YES()
//COMPILE SOURCE=*LIB-ELEM(LIB=&LIB,ELEM=ANWEND&NR..C),-
//    MODULE-OUTPUT=*LIB-ELEM(LIB=&LIB,ELEM=ANWEND&NR)
//END
/EXIT-PROCEDURE

Erläuterungen

(1)Es wird angenommen, dass die SYSLIB.EDT.170 unter der Default-Userid installiert ist. Der C-Compiler benötigt diese Bibliothek, um die Header-Files der IEDTGLE-Schnittstelle zu finden.
(2)Die Entries in der Anwenderroutine sollen unter ihrem Originalnamen angesprochen werden können, daher müssen Kleinbuchstaben akzeptiert werden und Sonderzeichen (etwa "_" ) dürfen nicht verändert werden.