Section courante

A propos

Section administrative du site

 Langage  Elément  Tutoriel  Emulateur  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
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
Référence de mots réservés
Référence des procédures et des fonctions
Référence des directives de compilation
Fichiers et périphériques
Pointeurs en OSS Personal Pascal
Hatari
PCE - PC Emulator
Références des codes d'erreur du OSS Personal Pascal
Préface
Notes légal
Dictionnaire
Recherche

Pointeurs en OSS Personal Pascal

En OSS Personal Pascal, les pointeurs ne peuvent être utilisés que pour accéder aux données ayant été allouées dynamiquement. En particulier, le Pascal standard ne fournit aucun moyen de trouver l'adresse d'une variable globale ou locale existante. Bien qu'il existe des moyens de tricher et de contourner cette restriction, comme le montrent certaines des routines de démonstration sur les disques OSS Personal Pascal, leur fonctionnement n'est pas garanti. Dans tous les cas, la probabilité qu'ils soient transportables vers d'autres versions de Pascal est au mieux faible.

Parce que l'utilisation de pointeurs est si restreinte, nous devons d'abord discuter de la façon dont Pascal alloue et désalloue des zones de données dynamiques. De plus, bien que les deux routines accomplissant ces tâches soient appelées procédures, elles violent tellement les règles de paramètres de procédure standard qu'il peut être plus susceptible de les considérer comme des types particuliers d'instructions.

NEW et DISPOSE

New(p);
Dispose(p);

La procédure New alloue une variable dynamique de "type de domaine" de p afin que la variable dynamique puisse être accédée en utilisant l'accès variable à partir de p^. Si p est un pointeur vers un type d'objet, alors ce type particulier est son type de domaine.

NOTE : La valeur de la variable dynamique est indéfinie après son affectation. Ne comptez pas sur la mémoire effacée, les chaînes de caractères ayant une longueur de zéro,...

La procédure Dispose désalloue la variable dynamique associée au pointeur p, laissant p indéfini. Dans OSS Personal Pascal, désallouer signifie simplement que l'espace utilisé par la variable dynamique est renvoyé au tas afin qu'il puisse être à nouveau alloué ultérieurement.

Référencer des variables de pointeur

Les pointeurs peuvent être comparés à d'autres pointeurs du même type de domaine, ou à la constante NIL, en utilisant les opérateurs relationnels "=" et "<>". Mais aucune autre comparaison n'est valable pour les pointeurs. Une variable pointeur peut être légalement modifiée de l'une des quatre manières suivantes. Pour chacune des manières ci-dessous, supposons que la déclaration suivante est en vigueur (et que chaque instruction est exécutée dans l'ordre donné) :

  1. VAR p,r:^INTEGER;

Vous pouvez affecter à n'importe quel pointeur la constante de pointeur prédéfinie NIL :

  1. p:=NIL;

Vous pouvez allouer un entreposage de données dynamique et l'affecter à un pointeur via la procédure NEW :

  1. NEW(p);

Vous pouvez lui affecter la valeur d'un autre pointeur du même type de domaine :

  1. r:=p;

À ce stade, vous pouvez utiliser soit "r" soit "p" pour faire référence à la zone de données obtenue via l'appel NEW. Par exemple :

  1. p^:=29;
  2. WriteLn(r^);

Cela produira les résultats attendus, comme si vous aviez codé :

  1. WriteLn(29);

Vous pouvez utiliser la procédure DISPOSE pour désallouer l'entreposage de données référencé par un pointeur :

  1. DISPOSE(r);

ATTENTION : C'est une erreur dans le Pascal standard d'utiliser les données pointées par une variable ayant été «supprimée», mais aucune méthode pour indiquer cette erreur n'est spécifiée. Pratiquement aucun compilateur Pascal ne pourrait garder une trace de toutes les variables de pointeur faisant référence au même espace alloué. Avec OSS Personal Pascal, vous pourriez obtenir une erreur «pointer out of heap» si vous essayez maintenant cette instruction :

  1. WriteLn(p^);

Mais si certains NEW ultérieurs avaient alloué ce même espace à un autre pointeur, les résultats sont imprévisibles.

Allocation dynamique des enregistrements de variantes

Lorsque vous utilisez la procédure NEW pour allouer des variables dynamiques d'un type d'enregistrement de variante, vous pouvez spécifier les variantes que vous souhaitez activer en ajoutant des paramètres supplémentaires aux procédures New et Dispose. Cela permet d'économiser de grandes quantités d'espace de tas lorsque les variantes sont de tailles très différentes.

New(p,c1,c2...cN);
Dispose(p,c1,c2...cN);

La variable p est un pointeur avec un type de domaine d'enregistrement variant. Les constantes c1 à cN sont des constantes de casse dans des niveaux de variance de plus en plus profonds pour le type d'enregistrement variant. Par exemple, considérons ces déclarations :

  1. TYPE
  2.  vtype=RECORD
  3.   fixed:Real;
  4.    CASE Boolean OF
  5.     True:(vs:String[40]);
  6. False:(vp:^vtype);
  7.    END;
  8.  END;
  9. VAR
  10.  vrec:^vtype;

Compte tenu de l'exemple, un appel à :

  1. NEW(vrec,True);

allouerait 46 octets de mémoire dynamique et la rendrait accessible via vrec^, mais un appel à :

Une fois que la variable d'enregistrement de variante dynamique est allouée, elle est soumise aux mêmes restrictions que les enregistrements de variante normalement alloués, mais avec certains dangers. Après un appel pour la variante FALSE de VREC, toute tentative d'accès à VREC^.VS peut provoquer une erreur ou des effets secondaires désagréables. Une instruction accédant de manière invalide à la variante INACTIVE, telle que :

  1. vrec^.vs:='Un simple test';

pourrait effacer des zones imprévisibles de la mémoire en dehors de l'espace alloué dynamiquement. Enfin, une restriction majeure est que vous devez disposer de la variable exactement de la même manière que vous l'avez allouée. Le plantage du système est pratiquement garanti si vous effectuez cette paire d'appels en séquence :

  1. NEW(vrec,True);
  2. DISPOSE(vrec,False);


PARTAGER CETTE PAGE SUR
Dernière mise à jour : Dimanche, le 19 septembre 2021