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); |
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 :
- TYPE
- vtype=RECORD
- fixed:Real;
- CASE Boolean OF
- True:(vs:String[40]);
- False:(vp:^vtype);
- END;
- END;
- VAR
- vrec:^vtype;
Compte tenu de l'exemple, un appel à :
- 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 :
- 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 :