Section courante

A propos

Section administrative du site

 Langage  Elément  Tutoriel  Annexe  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
Rust
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Introduction
Les opérateurs
Référence des procédures et des fonctions
Référence des mots réservés
Les premiers pas
Vocabulaire Pascal
Les instructions WITH et VIEWING
Allocation dynamique
Les modules
Vectorisation et optimisation
Référence des codes d'erreurs
Ensemble de caractères
Erreurs non signalées par Cray Pascal
Exemples de programmation d'entrée/sortie
Préface
Notes légal
Dictionnaire
Recherche

Allocation dynamique

Pascal permet l'allocation de mémoire pour une variable soit au moment de la compilation d'un programme, soit de manière dynamique pendant l'exécution du programme.

Les variables déclarées dans une instruction VAR se voient allouer de la mémoire lors de la compilation du programme. Cependant, les variables allouées de manière dynamique ne se voient pas allouer de mémoire tant que le programme en cours d'exécution ne les demande pas via la procédure prédéfinie NEW. Les variables deviennent actives après l'exécution de la procédure NEW et elles restent actives jusqu'à ce que le programme en cours d'exécution localise leur espace en appelant la procédure prédéfinie DISPOSE. L'espace libéré est alors disponible pour être réutilisé par les variables allouées ultérieurement.

Vous ne fournissez pas de nom par lequel référencer une variable allouée de manière dynamique. La variable est référencée indirectement via un pointeur, auquel est attribuée l'adresse mémoire d'une variable allouée de manière dynamique lorsque cette variable est allouée. Avant qu'une variable allouée de manière dynamique ne soit définie ou après qu'elle soit libérée, le pointeur la référençant a une valeur indéfinie. La valeur spéciale NIL, correspondant à l'absence d'adresse mémoire, peut également être attribuée à un pointeur.

Les procédures NEW et DISPOSE allouent et désallouent des variables. (p représente une variable pointeur.) La fonction SIZEOF donne la taille d'une variable dynamique. Une description suit :

Fonction ou procédure Description
NEW(p)
(procédure)
Définit une variable allouée dynamiquement pointée par p. La variable allouée dynamiquement est du type auquel p est lié.
NEW(p, tag-field-value1' tag-field-value2, ... tag-field-valuen )
(procédure)
Définit un enregistrement dynamique avec des variantes pointées par p. L'espace alloué aux champs de variante dépend des valeurs des champs de balise répertoriées. Les valeurs des champs de balise doivent être répertoriées dans l'ordre déclaré et la liste doit être contiguë. La première valeur de champ de balise doit correspondre au premier champ de balise déclaré, mais la dernière valeur de champ de balise de la liste ne doit pas nécessairement être le dernier champ de balise déclaré.
DISPOSE(p)
(procédure)
Désalloue la variable allouée dynamiquement pointée par p. p conserve la même valeur, mais p^ devient indéfini.
SIZEOF(p, tag-field-value1' tag-field-value2' ... tag-field-valuen )
(fonction)
Renvoie la taille (en mots Cray) d'une variable dynamique : c'est-à-dire le nombre entier de mots qu'un appel à NEW alloue lorsqu'il est appelé avec la même liste de paramètres. SIZEOF prend un nombre variable de paramètres et fonctionne exactement comme NEW utilisé comme fonction. La valeur du pointeur p est renvoyée sans modification.

La fonction SIZEOF est une extension CRI de la norme ISO niveau 1 Pascal.

Exemple :

  1. TYPE pntr = ^personnel;
  2.      personnel = RECORD
  3.       link:pntr;
  4.      END;
  5. VAR p1, p2, first: pntr;

Cet exemple déclare un type de pointeur nommé pntr et trois variables de pointeur nommées p1, p2 et first étant liées au type d'enregistrement nommé personnel. L'enregistrement lui-même contient une variable de pointeur nommée link. Le premier enregistrement est alloué dynamiquement de la manière suivante :

  1. NEW(first);
  2. first^.link := NIL;

La première instruction alloue dynamiquement un enregistrement de type personnel et définit le pointeur pour qu'il pointe vers celui-ci. La deuxième instruction accède au champ de lien de cet enregistrement via le pointeur et lui attribue la valeur NIL. Un deuxième enregistrement peut être alloué dynamiquement et lié au premier comme suit :

  1. p2:=first;
  2. NEW(p1);
  3. p1^.link:=p2^.link;
  4. p2^.link:=p1;

La liste des enregistrements est liée par les champs de liaison. Les enregistrements sont ajoutés au milieu d'une telle liste en procédant comme suit :

Pour supprimer un enregistrement, le pointeur p2 est à nouveau défini pour pointer vers l'enregistrement précédant celui à supprimer. Les instructions suivantes suppriment l'enregistrement tout en conservant la liste dans l'ordre :

  1. p2^.link := p1^.link;
  2. DISPOSE(p1);

La deuxième forme de l'instruction NEW fonctionne de la même manière que la première, mais elle permet également de spécifier des valeurs de champ de balise pour les enregistrements variants.

Exemple :

  1. TYPE pntr = personnel;
  2.      personnel = RECORD
  3.       link: pntr;
  4.       CASE pension: vested OF
  5.        unvested;
  6.        partvest : (pmoney, percentage: REAL);
  7.        fullvest : (fmoney: REAL;
  8.                    yearvested: INTEGER);
  9.                    CASE retired: BOOLEAN OF
  10.                     FALSE ();
  11.                     TRUE (pension_monthly_amt:REAL);
  12.        END;
  13. VAR p1, p2, first: pntr;

Un enregistrement pour un employé actuellement actif et pleinement investi est attribué comme suit :

  1. NEW(p1, fullvest, FALSE);

Un enregistrement relatif à un employé retraité ayant acquis toutes ses droits est réaffecté comme suit :

  1. NEW(p1, fullvest, TRUE);

Un enregistrement comprenant les champs fmoney, yearvested et pension_montly_amt est alloué par l'instruction ci-dessus. La variante d'un enregistrement alloué par cette forme de l'instruction NEW ne peut pas être modifiée ultérieurement dans le programme. L'enregistrement ci-dessus, par exemple, ne peut pas être modifié ultérieurement pour contenir les champs désignés par la valeur de champ de balise partvest.

Si un enregistrement de variante est alloué dynamiquement par la première forme de l'instruction NEW (en ne spécifiant aucune valeur de champ de balise), suffisamment d'espace est alloué pour répondre aux exigences les plus importantes possibles.



PARTAGER CETTE PAGE SUR
Dernière mise à jour : Vendredi, le 13 octobre 2017