En COBOL, la mémoire est allouée de façon séquentielle et fixe selon les déclarations de la DATA DIVISION. Chaque variable (ou groupe) occupe un espace précis et contigu en mémoire.
Cet exemple va vous aider à visualiser comment COBOL organise les octets en mémoire.
Déclaration des variables
01 CLIENT-A PIC X(10).
01 CLIENT-B.
02 ID-C PIC X(03).
02 FILLER PIC X(03).
Allocation mémoire – Schéma simplifié
Adresse mémoire : 100 101 102 103 104 105 106 107 108 109 110
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
CLIENT-A (10 octets)│ │ │ │ │ │ │ │ │ │ │ │ ← 100 à 109 (10 octets)
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
Adresse mémoire : 120 121 122 123 124 125 126
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┐
CLIENT-B (6 octets) │ │ │ │ │ │ │ │ ← 120 à 125 (6 octets)
└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
│ID-C │ FILLER │
└───────────────┘─────────────────────────┘
120 122 123 125
Explications détaillées pour débutants
CLIENT-APIC X(10)
→ Variable élémentaire de 10 octets.
→ Supposons qu’elle commence à l’adresse 100.
→ Elle occupe donc les adresses 100 à 109 (10 octets inclus).CLIENT-B(groupe de niveau 01)
→ Groupe de 6 octets au total.
→ Supposons qu’il commence à l’adresse 120.
→ Il occupe donc les adresses 120 à 125.ID-CPIC X(03) (niveau 02)
→ Premier sous-élément du groupeCLIENT-B.
→ Il prend les 3 premiers octets du groupe → adresses 120 à 122.FILLERPIC X(03)
→ Deuxième sous-élément du groupe.
→ Il prend les 3 octets suivants → adresses 123 à 125.
→ On ne peut pas accéder directement à FILLER par son nom (c’est une zone de remplissage anonyme).- Accès via le groupe
CLIENT-B
En utilisant le nom du groupeCLIENT-B, on accède aux 6 octets complets (120 à 125), donc à la foisID-C+FILLER.
Exemple de code montrant les accès
IDENTIFICATION DIVISION.
PROGRAM-ID. MEMORY-EXAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CLIENT-A PIC X(10) VALUE "ABCDEFGHIJ".
01 CLIENT-B.
02 ID-C PIC X(03) VALUE "123".
02 FILLER PIC X(03) VALUE " ".
PROCEDURE DIVISION.
DISPLAY "CLIENT-A (10 octets) : [" CLIENT-A "]"
DISPLAY "ID-C (3 octets) : [" ID-C "]"
DISPLAY "CLIENT-B (6 octets) : [" CLIENT-B "]"
MOVE "XYZ" TO ID-C
DISPLAY "Après modification ID-C :"
DISPLAY "ID-C : [" ID-C "]"
DISPLAY "CLIENT-B : [" CLIENT-B "]" *> on voit que le groupe voit la modif
STOP RUN.
Télécharger le code
Sortie attendue
CLIENT-A (10 octets) : [ABCDEFGHIJ]
ID-C (3 octets) : [123]
CLIENT-B (6 octets) : [123 ]
Après modification ID-C :
ID-C : [XYZ]
CLIENT-B : [XYZ ]
À retenir :
- Chaque variable / groupe occupe un espace contigu et fixe en mémoire.
- Les groupes (
01,02…) permettent d’accéder à plusieurs octets en une seule fois. FILLERsert à réserver de l’espace sans nom → on y accède uniquement via le groupe parent.- Quand on modifie un sous-élément (
ID-C), le groupe parent (CLIENT-B) « voit » immédiatement la modification.