Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

Weitere Datenbereiche (AREAs)

Zusätzlich zum Kommunikationsbereich und zum SPAB können Sie noch weitere Bereiche als Parameter übergeben, siehe "Weitere Bereiche". Einen solchen Bereich legen Sie in C/C++ als Quelltext an, welcher nur Datendefinitionen, aber keine ausführbaren Anweisungen enthält.

Wie Sie solche Bereiche in C/C++ definieren und in Ihren C/C++-Programmen einsetzen, wird mit Hilfe von Beispielen erläutert.

Beispiel mit AREAs (Unix-, Linux- und Windows-Systeme)

Im Folgenden werden zwei Areas generiert, in einer C-Source definiert und an ein Teilprogramm übergeben. Definiert werden:

  • die Area area für den direkten Zugriff, d.h. der Datenbereich wird direkt an das Teilprogramm übergeben, und

  • die Area areaind für den indirekten Zugriff.

KDCDEF-Generierung
AREA area,ACCESS=DIRECT
AREA areaind,ACCESS=INDIRECT
C/C++-Source zur Versorgung der zusätzlichen Datenbereiche erstellen

Die zu den Areas gehörenden Datenstrukturen definieren Sie wie folgt in einer C/C++-Source. In diesem Beispiel wird bei areaind, d.h. bei der Area mit indirektem Zugriff, die Adresse der Area zum Übersetzungszeitpunkt gesetzt.

Definition von Areas
char area[20] = "Area direct "; 
static char area_ind[30] = "Area indirect "; 
char *areaind = &area_ind[0]; 

Die C/C++-Source müssen Sie mit dem C/C++-Compiler übersetzen und das erzeugte Objektmodul müssen Sie zu den Teilprogrammen dazu binden.

Wollen Sie die Adresse der Area areaind während des Anwendungslaufs setzen, dann definieren Sie areaind in der C/C++-Source wie folgt:

char *areaind;

Während des Anwendungslaufs (typischerweise im Event-Exit START) müssen Sie dann areaind mit der Adresse der Area versorgen, den Sie den Teilprogrammen als Parameter übergeben wollen, z.B. durch die Anweisung:

static char area_ind[30] = "Area indirect ";
areaind = &area_ind[0];

Damit ist es beispielsweise möglich, im Event-Exit START ein Shared Memory zu eröffnen und die Adresse des Shared Memory in der Zeigervariablen areaind zu hinterlegen. Die Teilprogramme bekommen damit die Möglichkeit, auf das Shared Memory zuzugreifen.

Zugriff auf die Area-Bereiche in den Teilprogrammen auf Unix-, Linux- und Windows-Systemen

Ein Teilprogramm, in dem Sie die Areas bzw. einer der Areas benutzen, muss wie folgt aussehen. Dabei ist zu beachten, dass die Reihenfolge der Areas in der Parameterliste mit der Reihenfolge der AREA-Anweisungen bei der KDCDEF-Generierung übereinstimmen muss.

Teilprogramm in C
void areaprg ( 
struct spab *spab , 
struct kc_ca *kb , 
char area1 [20] , 
char area2 [30] ) 
{ 
sprintf ( BUFFER 
, "Hello world from UTM (Lterm = %.8s)\n" 
"Area is '%s' \n" 
"Area (indirect) is '%s' \n" 
, kb -> kopf.kclogter 
, area1 
, area2 
); 
...

Alternative zu AREAs

Falls Teilprogramme, die AREAs verwenden, aus einer Anwendung in eine andere Anwendung übernommen werden sollen, kann die Verwendung von AREAs auf Grund ggf. unterschiedlicher Parameterleisten zu Problemen führen.

Für C/C++-Programme gibt es folgende Alternativen. Man unterscheidet hier, ob der Datenbereich im prozesslokalen Speicher oder im Shared Memory auf dem Unix- oder Linux-System bzw. im Memory Mapped File auf dem Windows-System liegt.

BS2000-Systeme

Für BS2000-Systeme:  Datenbereiche im prozesslokalen Speicher
Hierzu muss man nur für jeden Datenbereich in C/C++ eine Struktur global zur Verfügung stellen, auf die andere Module mit der gleichen Definition und zusätzlich dem Speicherklassenattribut 'extern' zugreifen können.

Unix-, Linux- und Windows-Systeme

Für Unix- und Linux-Systeme im Shared Memory und für Windows-Systeme im Memory Mapped File:

Im Startexit stellt man eine Struktur zur Verfügung (siehe Beispiel 3) mit:

static DataAreas struct {
       struct table *TABLE1;
       struct table *TABLE2;
       struct table *TABLE3;
       };
...
struct DataAreas ExternDataAreas;

Im Startexit werden dann die Shared Memory-Bereiche angefordert und die Adressen in der Struktur ExternDataAreas versorgt.
Zugegriffen wird von anderen Teilprogrammen auf die Struktur

extern struct DataAreas ExternDataAreas;

Beispiel mit AREAs (BS2000-Systeme)

Man stellt einen Datenbereich (siehe Beispiel), der z.B. in Assembler geschrieben worden ist, zur Verfügung:

TABLE1   CSECT PUBLIC
         DS    CL64
         END

Diese CSECT wird übersetzt und ggf. mit weiteren Modulen gebunden. Das Modul (ohne ein weiteres dazugebundene Modul mit Coding) soll den Namen MTABLE1 haben, dann generiert man es als Lademodul:

LOAD-MODULE  MTABLE1
           , LOAD-MODE = (POOL , poolname , NO-PRIVATE-SLICE ) -
           , ...

In einem Teilprogramm oder Event-Exit ermöglichen Sie dann mit

extern struct table TABLE1;

den Zugriff auf den Datenbereich. Dieses Teilprogramm oder Event-Exit muss dann dynamisch nachgebunden werden.

Beispiel mit AREAs (alle Systeme)

Die Bereiche TABLE1, TABLE2 und TABLE3 sind in dieser Reihenfolge mit der AREA-Anweisung definiert worden. In einem Teilprogramm wird TABLE3 benötigt. TABLE1, TABLE2 und TABLE3 haben die gleiche Struktur und werden wie folgt definiert:

struct TABLE
   { int   nr;
     int  tag;
     char name[20];
     char firma[20];
     int best_nr;
     int menge;
     float preis;
     int rabatt;

};

Die Adressen dieser Bereiche werden wie folgt übergeben.

 ...
#include <kcmac.h>                       /* UTM-Datenstrukturen    */
   ...
   struct ca_area
     {...};
   struct work
     {...};
struct TABLE
   {...};
...
void cprog (struct ca_area *ca, struct work *spab, struct TABLE *TABLE1,
            struct TABLE *TABLE2, struct TABLE *TABLE3)
{ ...