Types de données entiers en Pascal. La programmation. Types de données numériques Pascal-Pascal

Le plus courant en mathématiques types numériques- Ce entier des nombres qui représentent un nombre infini de valeurs discrètes, et valide des nombres qui représentent un continuum illimité de valeurs.

Description des types de données numériques de Pascal (entiers)

Au sein d’un même langage, différents sous-ensembles de l’ensemble des entiers peuvent être implémentés. La plage des valeurs possibles des types numériques entiers dépend de leur représentation interne, qui peut être un, deux ou quatre octets. Ainsi, dans Pascal 7.0, les types de données numériques entiers suivants sont utilisés :

Avec tout types de données numériques Pascal peut effectuer les opérations suivantes :

  • Arithmétique:
    ajout(+);
    soustraction(-);
    multiplication(*);
    reste de la division (mod);
    exponentiation;
    unaire plus (+);
    unaire moins (-).
  • Opérations relationnelles :
    relation d'égalité (=);
    relation d'inégalité (<>);
    le rapport est inférieur (<);
    rapport supérieur à (>);
    relation pas inférieure à (>=);
    plus d'attitude (<=).

En agissant avec types de données numériques entiers le type du résultat correspondra au type des opérandes, et si les opérandes sont de types entiers différents, au type de l'opérande qui a la puissance maximale (plage maximale de valeurs). Un éventuel débordement du résultat n'est en aucun cas contrôlé (C'est important!) , ce qui peut conduire à des erreurs.

Une attention particulière doit être accordée à l'opération de division des types de données numériques entières. Pascal autorise deux opérations de division, qui sont notées en conséquence "/" Et div. Il faut savoir que le résultat de la division "/" n'est pas un entier, mais nombre réel(cela est vrai même si vous divisez 8 par 2, c'est-à-dire 8/2=4,0). La division div est division entière, c'est à dire. le type de résultat est entier.

Description des types de données numériques de Pascal (réels)

Le type de données numérique réel fait référence à un sous-ensemble de nombres réels qui peuvent être représentés dans le format dit à virgule flottante avec un nombre fixe de chiffres. Avec la virgule flottante, chaque type de données numérique est représenté par deux groupes de chiffres. Le premier groupe de nombres s’appelle la mantisse, le second est l’exposant. En général, un type de données numérique sous forme de virgule flottante peut être représenté comme suit : X= (+|-)MP (+ | -) r, où M est la mantisse du nombre ; r – ordre des nombres (r – entier) ; P – base du système numérique. Par exemple, pour la base décimale, la représentation 2E-1 (ici E est la base du système de nombres décimaux) ressemblera à : 2*10 -1 =0,2, et la représentation 1,234E5 correspondra à : 1,234*10 5 =123400.0.

Pascal utilise les types de nombres réels suivants, qui définissent un nombre arbitraire uniquement avec une certaine précision finie en fonction du format interne du nombre réel :

Lors de la description d'une variable réelle de type real, une variable de 4 octets sera créée dans la mémoire de l'ordinateur. Dans ce cas, 3 octets seront donnés pour la mantisse, et un octet pour la commande.

Les opérations suivantes peuvent être effectuées sur des types de données numériques réels :

  • Arithmétique:
    ajout (+);
    soustraction(-);
    multiplication(*);
    division(/);
    exponentiation;
    unaire plus (+);
    unaire moins (-).
  • Opérations relationnelles :
    relation d'inégalité (<>);
    le rapport est inférieur (<);
    rapport supérieur à (>);
    relation pas inférieure à (>=);
    plus d'attitude (<=).

Comme vous pouvez le constater, Pascal se caractérise par une riche gamme de types réels, mais l'accès aux types de données numériques célibataire, double Et étendu uniquement possible dans des modes de compilation spéciaux. Ces types de données numériques sont conçus pour la prise en charge matérielle de l'arithmétique à virgule flottante, et pour les utiliser efficacement, votre PC doit inclure un coprocesseur mathématique.

Le type de données numérique occupe une position particulière en Pascal. composition, qui est traité comme un nombre réel sans parties exponentielles ni fractionnaires. En fait, composition est un « grand » entier signé qui conserve 19 à 20 chiffres décimaux significatifs. En même temps, le type de données numérique composition dans les expressions, il est entièrement compatible avec d'autres types réels : toutes les opérations réelles y sont définies, il peut être utilisé comme argument fonctions mathématiques etc.

À propos de la conversion des types de données numériques de Pascal

En Pascal, les conversions implicites (automatiques) de types de données numériques sont presque impossibles. Une exception est faite uniquement pour le type entier, qui peut être utilisé dans des expressions telles que réel. Par exemple, si les variables sont déclarées comme ceci :

Var X : entier ; Y : réel ;

C'est l'opérateur

sera syntaxiquement correct, bien qu'il y ait une expression entière à droite du signe d'affectation et une variable réelle à gauche, le compilateur convertira automatiquement les types de données numériques. La conversion inverse est automatiquement saisie réel en nature entier impossible en Pascal. Rappelons combien d'octets sont alloués aux variables de type entier Et réel: pour le type de données entier entier 2 octets de mémoire sont alloués, et en réalité - 6 octets. Convertir réel V entier Il existe deux fonctions intégrées : rond(x) arrondit le réel x à l'entier le plus proche, tronc(x) tronque un nombre réel en supprimant la partie fractionnaire.

Agence fédérale pour l'éducation

Essai

"TYPES DE DONNÉES EN PASCAL"

1. Types de données

Toutes les données, c'est-à-dire les constantes, variables, propriétés, valeurs de fonction ou expressions sont caractérisées par leurs types. Le type définit l'ensemble valeurs acceptables, que peut avoir tel ou tel objet, ainsi que l'ensemble des opérations valides qui s'y appliquent. De plus, le type détermine également le format de la représentation interne des données dans la mémoire du PC.

En général, le langage Object Pascal se caractérise par une structure ramifiée de types de données (Fig. 1.1). Le langage fournit un mécanisme pour créer de nouveaux types, grâce auquel le nombre total de types utilisés dans un programme peut être aussi grand que souhaité.

Les données traitées dans le programme sont divisées en variables, constantes et littéraux :

Constantes représentent des données dont les valeurs sont définies dans la section de déclaration constante et ne changent pas pendant l'exécution du programme.

Variables sont déclarées dans la section de déclaration des variables, mais contrairement aux constantes, elles reçoivent leurs valeurs lors de l'exécution du programme, et ces valeurs peuvent être modifiées. Les constantes et les variables peuvent être désignées par leur nom.

Littéral n'a pas d'identifiant et est représenté directement par la valeur dans le texte du programme.

Taper définit l'ensemble des valeurs que les éléments de données peuvent prendre et l'ensemble des opérations autorisées sur eux.

Ce chapitre et les quatre suivants fournissent Description détaillée tous les types.

1.1 Types simples

À types simples Ceux-ci incluent les types ordinaux, réels et datetime.

Types ordinaux diffèrent en ce que chacun d’eux a un nombre fini de valeurs possibles. Ces valeurs peuvent être ordonnées d'une certaine manière (d'où le nom des types) et, par conséquent, chacune d'elles peut être associée à un nombre entier - le nombre ordinal de la valeur.

Types réels, à proprement parler, ont également un nombre fini de valeurs, qui est déterminé par le format de la représentation interne d'un nombre réel. Cependant, le nombre de valeurs possibles de types réels est si grand qu'il n'est pas possible d'associer un entier (son nombre) à chacune d'elles.

Type date-heure conçu pour stocker la date et l’heure. En fait, il utilise le format réel à ces fins.

1.1.1 Types ordinaux

Les types ordinaux incluent (voir Figure 1.1) les types entier, logique, caractère, énuméré et plage. La fonction Ord(x) peut être appliquée à n'importe lequel d'entre eux, qui renvoie le numéro ordinal de la valeur de l'expression X.


Riz. 1.1 - Structure des types de données

Pour entier types, la fonction ord(x) renvoie la valeur de x lui-même, c'est-à-dire Ord(X) = x pour x appartenant à n'importe quel entier taper. Application d'Ord(x) à logique , symbolique et énumérable types donne un entier positif compris entre 0 et 1 ( type booléen), de 0 à 255 ( symbolique), de 0 à 65535 ( dénombrable). Gamme de types préserve toutes les propriétés du type ordinal de base, donc le résultat de l'application de la fonction ord(x) dépend des propriétés de ce type.

Vous pouvez également appliquer des fonctions aux types ordinaux :

préd(x)- renvoie la valeur précédente du type ordinal (la valeur qui correspond au nombre ordinal ord(x) -1, c'est-à-dire ord(pred(x)) = ord(x) - 1 ;

succès(x)- renvoie la valeur suivante du type ordinal, qui correspond au nombre ordinal ord(x) +1, c'est-à-dire ord(Succ(x)) = ord(x) + 1.

Par exemple, si un programme définit une variable

alors la fonction PRED(c) renverra le caractère « 4 », et la fonction SUCC(c) renverra le caractère « 6 ».

Si nous imaginons n'importe quel type ordinal comme un ensemble ordonné de valeurs augmentant de gauche à droite et occupant un certain segment sur l'axe des nombres, alors la fonction pred(x) n'est pas définie pour l'extrémité gauche, et succ (x) est non défini pour l'extrémité droite de ce segment.

Types entiers . La plage des valeurs possibles des types entiers dépend de leur représentation interne, qui peut être un, deux, quatre ou huit octets. Dans le tableau 1.1 montre les noms des types entiers, la longueur de leur représentation interne en octets et la plage de valeurs possibles.

Tableau 1.1 - Types entiers

Nom Longueur, octets Plage de valeurs
Cardinal 4 0. .. 2 147 483 647
Octet 1 0...255
Raccourci 1 -128...+127
Petitint 2 -32 768...+32 767
Mot 2 0...65 535
Entier 4
Entier long 4 -2 147 483 648...+2 147 483 647
Int64 8 -9*1018...+9*1018
Mot Long 4 0. . .4 294 967 295

Les types Mot Long Et Int64 ont été introduits pour la première fois dans la version 4, et les types Petitint Et Cardinal non disponible dans Delphi 1. Tapez entier pour cette version, il prend 2 octets et a une plage de valeurs allant de -32768 à +32767, c'est-à-dire la même chose que Petitint .

Lorsque vous utilisez des procédures et des fonctions avec des paramètres entiers, vous devez être guidé par « l'imbrication » des types, c'est-à-dire partout où il peut être utilisé mot, autorisé à utiliser Octet(mais pas l'inverse), en Entier long"entre dans" Petitint, qui à son tour comprend Raccourci .

Liste des procédures et fonctions applicables à types intégraux, est donné dans le tableau. 1.2. Les lettres b, s, w, i, l désignent des expressions du type suivant : Octet , Entier court, mot, entier et entier long ,

x est une expression de l’un de ces types ; les lettres vb, vs, vw, vi, vl, vx désignent des variables des types correspondants. Un paramètre facultatif est indiqué entre crochets.

Tableau 1.2 - Procédures et fonctions standards applicables aux types entiers

Appel Type de résultat Action
abdos(x) X Module de retour x
chr(b) Carboniser Renvoie un caractère par son code
déc(vx[,i]) - Diminue la valeur de vx de i, et en l'absence de i - de 1
inc(vx[,i]) - Augmente la valeur de vx de i, et en l'absence de i - de 1
Salut (w) Octet Renvoie l'arc le plus élevé de l'argument
Salut (je) Même Renvoie le troisième octet
Lo(je) Renvoie l'octet de poids faible de l'argument
Faible) Même
impair(l) Booléen Renvoie True si l'argument est un nombre impair
Aléatoire (w) Identique au paramètre Renvoie un nombre pseudo-aléatoire uniformément distribué dans la plage 0...(w-l)
carré(x) X Renvoie le carré de l'argument
échanger(je) Entier Échange des octets dans un mot
échanger(w) Mot Même

Lorsqu'on opère avec des entiers, le type du résultat correspondra au type des opérandes, et si les opérandes sont de types entiers différents - type général, qui comprend les deux opérandes. Par exemple, lorsque vous travaillez avec raccourci Et mot le type commun sera entier. DANS paramètre standard Le compilateur Delphi ne produit pas de code pour vérifier si une valeur est hors plage, ce qui peut conduire à des malentendus.

Types booléens . Les types logiques incluent Booléen, ByteBool, Bool, wordBool Et LongBool. En Pascal standard, seul le type est défini Booléen, d'autres types logiques sont introduits dans Object Pascal pour la compatibilité avec Windows : types Booléen Et OctetBool chacun occupe un octet, Booléen Et MotBool- 2 octets chacun, LongBool- 4 octets. Les valeurs booléennes peuvent être l'une des constantes pré-déclarées False ou True.

Le type booléen étant un type ordinal, il peut être utilisé dans une instruction de boucle de type dénombrable. Dans Delphi 32 pour Booléen signification

Ord (True) = +1, tandis que pour les autres types ( Bool, WordBool etc.)

Ord(True) = -1, donc ces types d'opérateurs doivent être utilisés avec prudence ! Par exemple, pour la version Delphi 6, l'instruction exécutable showMessage(" --- ") dans la boucle suivante pour ne sera jamais exécuté :

pour L : = Faux à Vrai, faites

Voir le message("--);

Si l'on remplace le paramètre de boucle type L dans l'exemple précédent par Booléen, la boucle s'exécutera et le message apparaîtra deux fois à l'écran. [Pour les versions 1 et 2 de Delphi ord (True) =+1 pour tout type booléen.]

Type de caractère . La valeur d'un type de caractère est l'ensemble de tous les caractères PC. Chaque caractère se voit attribuer un entier compris entre 0 et 255. Ce numéro sert de code pour la représentation interne du symbole ; il est renvoyé par la fonction ord.

Pour l'encodage sous Windows, on utilise le code ANSI (du nom de l'American National Standard Institute, l'institut américain de normalisation qui a proposé ce code). La première moitié des caractères PC avec les codes 0... 127 correspond au tableau 1.3. La seconde moitié des caractères avec les codes 128...255 varie selon les polices. Les polices Windows standard Arial Cyr, Courier New Cyr et Times New Roman utilisent les 64 derniers codes (de 192 à 256) pour représenter les caractères cyrilliques (sans les lettres « ё » et « Ё ») : « A »... « Z » sont des valeurs codées 192..223, "a"... "i" - 224...255. Les symboles « Ё » et « е » ont respectivement les codes 168 et 184.

Tableau 1.3 - Codage des caractères selon la norme ANSI

Code Symbole Code. Symbole Code. Symbole Code Symbole
0 NUL 32 B.L. 64 @ 96 "
1 ZON 33 ! 65 UN 97 UN
2 STX 34 66 DANS 98 b
3 ETX 35 # 67 AVEC 99 Avec
4 EOT 36 $ 68 D 100 d
5 ENQ 37 % 69 E 101 e
6 ACCK 38 & 70 F 102 F
7 BEL 39 " 71 g 103 d
8" BS. 40 ( 72 N 104 h
9 HT 41 ) 73 je 105 je
10 LF 42 * 74 J. 106 j
11 Vermont 43 + 75 À 107 k
12 FR 44 F 76 L 108 1
13 CR 45 - 77 M 109 m
14 DONC 46 78 N 110 n
15 SI. 47 / 79 0 111 Ô
16 DEL 48 0 80 R. 112 P.
17 DC1 49 1 81 Q 113 q
18 DC2 50 2 82 R. 114 r
19 DC3 51 3 83 S 115 s
20 DD 4 52 4 84 T 116 t
21 N.A.K. 53 5 85 U 117 toi
22 SYN 54 6 86 V 118 v
23 ETB 55 7 87 W 119 W
24 PEUT 56 8 88 X 120 X
25 E.M. 57 9 89 Oui 121 U
26 SOUS 58 : 90 Z .122 z
27 ÉCHAP 59 ; 91 t 123 {
28 FS 60 < 92 \ 124 1
29 G.S. 61 = 93 ] 125 }
30 R.S. 62 > 94 L 126 ~
31 NOUS 63 F 95 127 r

Les caractères avec les codes 0...31 font référence à codes de service. Si ces codes sont utilisés dans le texte des caractères du programme, ils sont considérés comme des espaces.

Un type de données définit un ensemble de valeurs valides et un ensemble d'opérations valides.

Types simples.

Les types simples sont divisés en ORDINAL et REAL.

1. TYPES DE COMMANDES , à leur tour, il y a :

un ensemble

Pascal définit 5 types entiers, qui sont définis en fonction du signe et de la valeur que prendra la variable.

Tapez le nom

Longueur (en octets)

Plage de valeurs

32 768...+32 767

2 147 483 648...+2 147 483 647

b) logique

Le nom de ce type est BOOLEAN. Les valeurs booléennes peuvent être l'une des constantes booléennes : VRAI (vrai) ou FAUX (faux).

c) symbolique

Le nom de ce type est CHAR - occupe 1 octet. La valeur d'un type de caractère est l'ensemble de tous les caractères PC. Chaque caractère se voit attribuer un entier compris entre 0 et 255. Ce numéro sert de code pour la représentation interne du symbole.

2. TYPES RÉELS .

Contrairement aux types ordinaux, dont les valeurs sont toujours mappées sur une série d'entiers et sont donc représentées de manière absolument précise dans PC, les valeurs des types réels définissent un nombre arbitraire uniquement avec une certaine précision finie en fonction du format interne du nombre réel. .

Longueur du type de données numérique, octets

Nom du type de données numérique

Nombre de chiffres significatifs d'un type de données numérique

Plage d'ordre décimal d'un type de données numérique

2*1063 +1..+2*1063 -1

TYPES STRUCTURÉS

Les types de données structurées définissent une collection ordonnée de variables scalaires et sont caractérisées par le type de leurs composants.

Les types de données structurés, contrairement aux types simples, définissent de nombreuses valeurs complexes avec un nom commun. On peut dire que les types structurels déterminent une certaine manière de former de nouveaux types à partir de types existants.

Il existe plusieurs méthodes de structuration. Selon la méthode d'organisation et le type de composants dans les types de données complexes, on distingue les variétés suivantes : type régulier (tableaux) ; type combiné (enregistrements); type de fichier(fichiers); plusieurs types ; type de chaîne (chaînes); dans la version 6.0 et antérieure du langage Turbo Pascal, un type d'objet (objets) a été introduit.

Contrairement aux types de données simples, les données de type structuré se caractérisent par la multiplicité des éléments qui forment ce type, c'est-à-dire une variable ou une constante d'un type structuré a toujours plusieurs composants. Chaque composant, à son tour, peut appartenir à un type structuré, c'est-à-dire l'imbrication des types est possible.

1. Tableaux

Les tableaux dans Turbo Pascal sont similaires à bien des égards aux types de données similaires dans d'autres langages de programmation. Une particularité des tableaux est que tous leurs composants sont des données du même type (éventuellement structurées). Ces composants peuvent être facilement organisés et chacun d’entre eux est accessible simplement en spécifiant un numéro de série.

La description du tableau est spécifiée comme suit :

<имя типа>= tableau[<сп.инд.типов>] de<тип>

Ici<имя типа>- identifiant correct ;

Tableau, de – mots réservés (tableau, de) ;

<сп.инд.типов>- une liste d'un ou plusieurs types d'index, séparés par des virgules ; les crochets encadrant la liste sont une exigence de syntaxe ;

<тип>- tout type de Turbo Pascal.

Tous les types ordinaux peuvent être utilisés comme types d'index dans Turbo Pascal, à l'exception des types LongInt et range avec le type de base LongInt.

La profondeur d'imbrication des types structurés en général, et donc des tableaux, est arbitraire, donc le nombre d'éléments dans la liste des index de type (taille du tableau) n'est pas limité, cependant, la longueur totale de la représentation interne d'un tableau ne peut pas être supérieur à 65 520 octets.

2. Dossiers

Un enregistrement est une structure de données composée d'un nombre fixe de composants appelés champs d'enregistrement. Contrairement à un tableau, les composants (champs) d'un enregistrement peuvent être divers types. Pour permettre de faire référence à l'un ou l'autre composant d'un enregistrement, les champs sont nommés.

La structure d'une déclaration de type de publication est :

< Nomtaper>=ENREGISTRER< coentreprise. des champs>FIN

Ici<имя типа>- identifiant correct ;

RECORD, END – mots réservés (enregistrement, fin) ;

<сп.полей>- liste des champs ; est une séquence de sections d'un enregistrement séparées par un point-virgule.

3 ensembles

Les ensembles sont un ensemble d'objets du même type qui sont logiquement connectés les uns aux autres. La nature des connexions entre objets est uniquement implicite par le programmeur et n'est en aucun cas contrôlée par Turbo Pascal. le nombre d'éléments inclus dans un ensemble peut varier de 0 à 256 (un ensemble qui ne contient pas d'éléments est dit vide).C'est l'inconstance du nombre de ses éléments qui fait que les ensembles diffèrent des tableaux et des enregistrements.

Deux ensembles sont considérés comme équivalents si et seulement si tous leurs éléments sont identiques et que l'ordre des éléments de l'ensemble est indifférent. Si tous les éléments d’un ensemble sont également inclus dans un autre, le premier ensemble est dit inclus dans le second.

La description du type d'ensemble est :

< Nomtaper>=ENSEMBLE DE< socles. taper>

Ici<имя типа>- identifiant correct ;

SET, OF – mots réservés (set, of) ;

<баз.тип>- le type de base des éléments de l'ensemble, qui peut être n'importe quel type ordinal sauf WORD, INTEGER et LONGINT.

Pour définir un ensemble, on utilise ce qu'on appelle le constructeur d'ensemble : une liste de spécifications des éléments de l'ensemble, séparées par des virgules ; la liste est entourée de crochets. Les spécifications d’éléments peuvent être des constantes ou des expressions d’un type de base, ainsi qu’un type de plage du même type de base.

4. Fichiers

Un fichier fait référence soit à une zone nommée mémoire externe Un PC ou un périphérique logique est une source ou un récepteur potentiel d'informations.

Tout fichier a trois caractéristiques

    il a un nom qui permet au programme de travailler avec plusieurs fichiers simultanément.

    il contient des composants du même type. Le type de composant peut être n'importe quel type Turbo Pascal, à l'exception des fichiers. En d’autres termes, vous ne pouvez pas créer un « fichier de fichiers ».

    encore la longueur fichier créé n’est en aucun cas précisé lors de son annonce et n’est limité que par la capacité des dispositifs de mémoire externes.

Type de fichier ou variable Type de fichier peut être réglé de trois manières :

< Nom>= FICHIER DE< taper>;

< Nom>=TEXTE;

<имя>= FICHIER ;

Ici<имя>- nom du type de fichier (identifiant correct) ;

FILE, OF – mots réservés (fichier, from) ;

TEXTE – nom modèle standard fichiers texte ;

<тип>- tout type de Turbo Pascal, sauf les fichiers.

Selon le mode de déclaration, trois types de dossiers peuvent être distingués :

· fichiers typés (définis par la clause FILE OF...) ;

· fichiers texte(défini par le type TEXTE) ;

· fichiers non typés (définis par le type FILE).

À propos de la conversion des types de données numériques de Pascal

En Pascal, les conversions implicites (automatiques) de types de données numériques sont presque impossibles. Une exception est faite uniquement pour le type entier, dont l'utilisation est autorisée dans les expressions de type réel. Par exemple, si les variables sont déclarées comme ceci :

Var X : entier ; Y : réel ;

puis l'opérateur

sera syntaxiquement correct, bien qu'il y ait une expression entière à droite du signe d'affectation et une variable réelle à gauche, le compilateur convertira automatiquement les types de données numériques. La conversion inverse automatiquement du type réel vers le type entier est impossible en Pascal. Rappelons combien d'octets sont alloués pour les variables de type entier et réel : 2 octets de mémoire sont alloués pour le type de données entier entier, et 6 octets pour le type réel. Il existe deux fonctions intégrées pour convertir un réel en entier : round(x) arrondit un réel x à l'entier le plus proche, trunc(x) tronque un réel en supprimant la partie fractionnaire.

Agence fédérale pour l'éducation

Essai

"TYPES DE DONNÉES EN PASCAL"

1. Types de données

Toutes les données, c'est-à-dire les constantes, variables, propriétés, valeurs de fonction ou expressions sont caractérisées par leurs types. Un type définit l'ensemble des valeurs valides qu'un objet peut avoir, ainsi que l'ensemble des opérations valides qui peuvent lui être appliquées. De plus, le type détermine également le format de la représentation interne des données dans la mémoire du PC.

En général, le langage Object Pascal se caractérise par une structure ramifiée de types de données (Fig. 1.1). Le langage fournit un mécanisme pour créer de nouveaux types, grâce auquel le nombre total de types utilisés dans un programme peut être aussi grand que souhaité.

Les données traitées dans le programme sont divisées en variables, constantes et littéraux :

Constantes représentent des données dont les valeurs sont définies dans la section de déclaration constante et ne changent pas pendant l'exécution du programme.

Variables sont déclarées dans la section de déclaration des variables, mais contrairement aux constantes, elles reçoivent leurs valeurs lors de l'exécution du programme, et ces valeurs peuvent être modifiées. Les constantes et les variables peuvent être désignées par leur nom.

Littéral n'a pas d'identifiant et est représenté directement par la valeur dans le texte du programme.

Taper définit l'ensemble des valeurs que les éléments de données peuvent prendre et l'ensemble des opérations autorisées sur eux.

Ce chapitre et les quatre suivants fournissent des descriptions détaillées de chaque type.

1.1 Types simples

Les types simples incluent les types ordinaux, réels et datetime.

Types ordinaux diffèrent en ce que chacun d’eux a un nombre fini de valeurs possibles. Ces valeurs peuvent être ordonnées d'une certaine manière (d'où le nom des types) et, par conséquent, chacune d'elles peut être associée à un nombre entier - le nombre ordinal de la valeur.

Types réels, à proprement parler, ont également un nombre fini de valeurs, qui est déterminé par le format de la représentation interne d'un nombre réel. Cependant, le nombre de valeurs possibles de types réels est si grand qu'il n'est pas possible d'associer un entier (son nombre) à chacune d'elles.

Type date-heure conçu pour stocker la date et l’heure. En fait, il utilise le format réel à ces fins.

1.1.1 Types ordinaux

Les types ordinaux incluent (voir Figure 1.1) les types entier, logique, caractère, énuméré et plage. La fonction Ord(x) peut être appliquée à n'importe lequel d'entre eux, qui renvoie le numéro ordinal de la valeur de l'expression X.


Riz. 1.1 - Structure des types de données

Pour entier types, la fonction ord(x) renvoie la valeur de x lui-même, c'est-à-dire Ord(X) = x pour x appartenant à n'importe quel entier taper. Application d'Ord(x) à logique , symbolique et énumérable types donne un entier positif compris entre 0 et 1 ( type booléen), de 0 à 255 ( symbolique), de 0 à 65535 ( dénombrable). Gamme de types préserve toutes les propriétés du type ordinal de base, donc le résultat de l'application de la fonction ord(x) dépend des propriétés de ce type.

Vous pouvez également appliquer des fonctions aux types ordinaux :

préd(x)- renvoie la valeur précédente du type ordinal (la valeur qui correspond au nombre ordinal ord(x) -1, c'est-à-dire ord(pred(x)) = ord(x) - 1 ;

succès(x)- renvoie la valeur suivante du type ordinal, qui correspond au nombre ordinal ord(x) +1, c'est-à-dire ord(Succ(x)) = ord(x) + 1.

Par exemple, si un programme définit une variable

alors la fonction PRED(c) renverra le caractère « 4 », et la fonction SUCC(c) renverra le caractère « 6 ».

Si nous imaginons n'importe quel type ordinal comme un ensemble ordonné de valeurs augmentant de gauche à droite et occupant un certain segment sur l'axe des nombres, alors la fonction pred(x) n'est pas définie pour l'extrémité gauche, et succ (x) est non défini pour l'extrémité droite de ce segment.

Types entiers . La plage des valeurs possibles des types entiers dépend de leur représentation interne, qui peut être un, deux, quatre ou huit octets. Dans le tableau 1.1 montre les noms des types entiers, la longueur de leur représentation interne en octets et la plage de valeurs possibles.

Tableau 1.1 - Types entiers

Nom Longueur, octets Plage de valeurs
Cardinal 4 0. .. 2 147 483 647
Octet 1 0...255
Raccourci 1 -128...+127
Petitint 2 -32 768...+32 767
Mot 2 0...65 535
Entier 4
Entier long 4 -2 147 483 648...+2 147 483 647
Int64 8 -9*1018...+9*1018
Mot Long 4 0. . .4 294 967 295

Les types Mot Long Et Int64 ont été introduits pour la première fois dans la version 4, et les types Petitint Et Cardinal non disponible dans Delphi 1. Tapez entier pour cette version, il prend 2 octets et a une plage de valeurs allant de -32768 à +32767, c'est-à-dire la même chose que Petitint .

Lorsque vous utilisez des procédures et des fonctions avec des paramètres entiers, vous devez être guidé par « l'imbrication » des types, c'est-à-dire partout où il peut être utilisé mot, autorisé à utiliser Octet(mais pas l'inverse), en Entier long"entre dans" Petitint, qui à son tour comprend Raccourci .

La liste des procédures et fonctions applicables aux types entiers est donnée dans le tableau. 1.2. Les lettres b, s, w, i, l désignent des expressions du type suivant : Octet , Entier court, mot, entier et entier long ,

x est une expression de l’un de ces types ; les lettres vb, vs, vw, vi, vl, vx désignent des variables des types correspondants. Un paramètre facultatif est indiqué entre crochets.

Tableau 1.2 - Procédures et fonctions standards applicables aux types entiers

Appel Type de résultat Action
abdos(x) X Module de retour x
chr(b) Carboniser Renvoie un caractère par son code
déc(vx[,i]) - Diminue la valeur de vx de i, et en l'absence de i - de 1
inc(vx[,i]) - Augmente la valeur de vx de i, et en l'absence de i - de 1
Salut (w) Octet Renvoie l'arc le plus élevé de l'argument
Salut (je) Même Renvoie le troisième octet
Lo(je) Renvoie l'octet de poids faible de l'argument
Faible) Même
impair(l) Booléen Renvoie True si l'argument est un nombre impair
Aléatoire (w) Identique au paramètre Renvoie un nombre pseudo-aléatoire uniformément distribué dans la plage 0...(w-l)
carré(x) X Renvoie le carré de l'argument
échanger(je) Entier Échange des octets dans un mot
échanger(w) Mot Même

Lorsque vous travaillez avec des entiers, le type du résultat correspondra au type des opérandes, et si les opérandes sont de types entiers différents, au type général qui inclut les deux opérandes. Par exemple, lorsque vous travaillez avec raccourci Et mot le type commun sera entier. Par défaut, le compilateur Delphi ne produit pas de code pour vérifier si une valeur est hors plage, ce qui peut conduire à des malentendus.

Types booléens . Les types logiques incluent Booléen, ByteBool, Bool, wordBool Et LongBool. En Pascal standard, seul le type est défini Booléen, d'autres types logiques sont introduits dans Object Pascal pour la compatibilité avec Windows : types Booléen Et OctetBool chacun occupe un octet, Booléen Et MotBool- 2 octets chacun, LongBool- 4 octets. Les valeurs booléennes peuvent être l'une des constantes pré-déclarées False ou True.

Le type booléen étant un type ordinal, il peut être utilisé dans une instruction de boucle de type dénombrable. Dans Delphi 32 pour Booléen signification

Ord (True) = +1, tandis que pour les autres types ( Bool, WordBool etc.)

Ord(True) = -1, donc ces types d'opérateurs doivent être utilisés avec prudence ! Par exemple, pour la version Delphi 6, l'instruction exécutable showMessage(" --- ") dans la boucle suivante pour ne sera jamais exécuté :

pour L : = Faux à Vrai, faites

Voir le message("--);

Si l'on remplace le paramètre de boucle type L dans l'exemple précédent par Booléen, la boucle s'exécutera et le message apparaîtra deux fois à l'écran. [Pour les versions 1 et 2 de Delphi ord (True) =+1 pour tout type booléen.]

Type de caractère . La valeur d'un type de caractère est l'ensemble de tous les caractères PC. Chaque caractère se voit attribuer un entier compris entre 0 et 255. Ce numéro sert de code pour la représentation interne du symbole ; il est renvoyé par la fonction ord.

Pour l'encodage sous Windows, on utilise le code ANSI (du nom de l'American National Standard Institute, l'institut américain de normalisation qui a proposé ce code). La première moitié des caractères PC avec les codes 0... 127 correspond au tableau 1.3. La seconde moitié des caractères avec les codes 128...255 varie selon les polices. Les polices Windows standard Arial Cyr, Courier New Cyr et Times New Roman utilisent les 64 derniers codes (de 192 à 256) pour représenter les caractères cyrilliques (sans les lettres « ё » et « Ё ») : « A »... « Z » sont des valeurs codées 192..223, "a"... "i" - 224...255. Les symboles « Ё » et « е » ont respectivement les codes 168 et 184.

Tableau 1.3 - Codage des caractères selon la norme ANSI

Code Symbole Code. Symbole Code. Symbole Code Symbole
0 NUL 32 B.L. 64 @ 96 "
1 ZON 33 ! 65 UN 97 UN
2 STX 34 66 DANS 98 b
3 ETX 35 # 67 AVEC 99 Avec
4 EOT 36 $ 68 D 100 d
5 ENQ 37 % 69 E 101 e
6 ACCK 38 & 70 F 102 F
7 BEL 39 " 71 g 103 d
8" BS. 40 ( 72 N 104 h
9 HT 41 ) 73 je 105 je
10 LF 42 * 74 J. 106 j
11 Vermont 43 + 75 À 107 k
12 FR 44 F 76 L 108 1
13 CR 45 - 77 M 109 m
14 DONC 46 78 N 110 n
15 SI. 47 / 79 0 111 Ô
16 DEL 48 0 80 R. 112 P.
17 DC1 49 1 81 Q 113 q
18 DC2 50 2 82 R. 114 r
19 DC3 51 3 83 S 115 s
20 DD 4 52 4 84 T 116 t
21 N.A.K. 53 5 85 U 117 toi
22 SYN 54 6 86 V 118 v
23 ETB 55 7 87 W 119 W
24 PEUT 56 8 88 X 120 X
25 E.M. 57 9 89 Oui 121 U
26 SOUS 58 : 90 Z .122 z
27 ÉCHAP 59 ; 91 t 123 {
28 FS 60 < 92 \ 124 1
29 G.S. 61 = 93 ] 125 }
30 R.S. 62 > 94 L 126 ~
31 NOUS 63 F 95 127 r

Les caractères avec les codes 0...31 font référence aux codes de service. Si ces codes sont utilisés dans le texte des caractères du programme, ils sont considérés comme des espaces.

Pour taper carboniser les opérations relationnelles sont applicables, ainsi que les fonctions intégrées :

Caractère (c)- tapez la fonction carboniser; convertit une expression en type Octet dans un symbole et le renvoie avec sa valeur ;

UpCase(CH)- tapez la fonction carboniser; Retour lettre capitale, si сн est une lettre latine minuscule, dans sinon renvoie le symbole сн lui-même (pour le cyrillique, il renvoie le caractère original).

Type d'énumération . Un type énuméré est spécifié par une énumération des valeurs qu'il peut recevoir. Chaque valeur est nommée par un identifiant et se trouve dans une liste entourée de parenthèses, par exemple :

couleurs = (rouge, blanc, bleu) ;

L'utilisation de types énumérés rend les programmes plus visuels.

La correspondance entre les valeurs d'un type énuméré et les nombres ordinaux de ces valeurs est établie par l'ordre d'énumération : la première valeur de la liste reçoit le nombre ordinal 0, la seconde - 1, etc. La capacité maximale de un type énuméré contient 65 536 valeurs, donc en fait le type énuméré spécifie un sous-ensemble du type entier mot et peut être considéré comme une déclaration compacte d'un groupe de constantes entières avec des valeurs 0, 1, etc.

L'utilisation de types énumérés augmente la fiabilité des programmes en vous permettant de contrôler les valeurs que reçoivent les variables correspondantes. Object Pascal permet la conversion inverse : toute expression de type Mot peut être converti en une valeur d'un type énuméré à moins que la valeur de l'expression entière ne dépasse la cardinalité de ce type. Cette conversion est réalisée en utilisant une fonction déclarée automatiquement avec le nom du type énuméré.

Gamme de types . Un type plage est un sous-ensemble de son type de base, qui peut être n’importe quel type ordinal à l’exception d’un type plage.

Un type de plage est défini par les limites de ses valeurs au sein du type de base :

<мин.знач.>..<макс.знач.>

Ici<мин. знач. > - valeur minimum plage de types ;<макс. знач. >- sa valeur maximale.

Le type de plage n'a pas besoin d'être décrit dans la section type, mais peut être spécifié directement lors de la déclaration de la variable.

Lors de la détermination d'un type de plage, vous devez suivre les règles suivantes :

deux caractères « .. » sont traités comme un seul caractère, les espaces entre eux ne sont donc pas autorisés ; la bordure gauche de la plage ne doit pas dépasser sa bordure droite.

Un type range hérite de toutes les propriétés de son type de base, mais avec les limitations de sa puissance inférieure. En particulier, si une variable est définie.

La bibliothèque standard Object Pascal comprend deux fonctions qui prennent en charge l'utilisation des types de plage :

Élevé(x)- renvoie la valeur maximale du type de plage auquel appartient la variable x ;

Faible(x)- renvoie la valeur minimale du type de plage.

1.1.2 Types réels

Contrairement aux types ordinaux, dont les valeurs sont toujours mappées sur une série d'entiers et sont donc représentées de manière absolument précise dans PC, les valeurs des types réels définissent un nombre arbitraire uniquement avec une certaine précision finie en fonction du format interne du nombre réel. .

Tableau 1.4 - Types réels

DANS Versions précédentes Type Delphi 1...3 Réel occupait 6 octets et avait une plage de valeurs de 2,9*10-39 à 1,7*1038. Dans les versions 4 et 5, ce type est équivalent au type Double. Si nécessaire (pour des raisons de compatibilité), utilisez 6 octets Réel, vous devez spécifier une directive du compilateur (SREALCOMPATIBILITY ON).

Comme le montre le tableau. 1.4, un nombre réel en Pascal Objet occupe de 4 à 10 octets contigus et a la structure suivante dans la mémoire du PC.

Ici s est le chiffre du signe du nombre ; e - partie exponentielle ; contient un ordre binaire ; m est la mantisse du nombre.

Mantisse m a une longueur de 23 (pour célibataire) jusqu'à 63 (pour Étendu) bits binaires, ce qui garantit une précision de 7...8 pour célibataire et 19...20 pour Étendu chiffres décimaux. Le point décimal (virgule) est implicite avant le chiffre gauche (le plus significatif) de la mantisse, mais lorsqu'on opère sur un nombre, sa position est décalée vers la gauche ou la droite conformément à l'ordre binaire du nombre stocké dans la partie exponentielle , c'est pourquoi les opérations sur les nombres réels sont appelées arithmétique à virgule flottante (virgule).

Notez que le coprocesseur arithmétique traite toujours les nombres au format Étendu, et les trois autres types réels dans ce cas sont obtenus en tronquant simplement les résultats à tailles requises et sont principalement utilisés pour économiser de la mémoire.

Les types occupent une position particulière dans Object Pascal composition Et Devise, qui sont traités comme des nombres réels avec des parties fractionnaires d'une longueur fixe : en composition la partie fractionnaire a une longueur de 0 chiffre, c'est-à-dire qu'elle est simplement absente, dans devise la longueur de la partie fractionnaire est de 4 décimales. En fait, les deux types définissent un grand entier signé qui stocke 19 à 20 chiffres décimaux significatifs (en interne, ils occupent 8 octets contigus). En même temps, dans les expressions composition Et devise sont entièrement compatibles avec tout autre type réel : toutes les opérations réelles y sont définies, elles peuvent être utilisées comme arguments de fonctions mathématiques, etc. Le domaine d'application le plus approprié pour ces types est celui des calculs comptables.

1.1.3 Type date-heure

Le type datetime est défini par un identifiant standard TDateHeure et est conçu pour stocker simultanément la date et l'heure. Dans la représentation interne, il occupe 8 octets et similaires devise est un nombre réel avec une partie fractionnaire fixe : la partie entière du nombre stocke la date et la partie fractionnaire stocke l'heure. La date est définie comme le nombre de jours écoulés depuis le 30 décembre 1899, et l'heure comme la fraction de jour écoulée depuis 0 heure, donc la valeur 36444,837 correspond à la date du 11/10/1999 et à l'heure 20h05. Le nombre de jours peut être négatif, mais les valeurs inférieures à -693594 (correspondant à la date 00.00.0000 de la Nativité du Christ) sont ignorées par les fonctions de conversion d'une date en type chaîne.

Type de données ci-dessus TDateHeure les mêmes opérations sont définies que sur les nombres réels, et les expressions de ce type peuvent impliquer des constantes et des variables de types entiers et réels.

Parce que le type TDateHeure compatible avec le format des nombres réels, vous pouvez facilement déterminer une date qui est en avance ou en arrière de plusieurs jours par rapport à une date donnée : pour ce faire, il suffit respectivement d'ajouter ou de soustraire l'entier souhaité à la date donnée.

1.2 Types structurés

Tous les types structurés (et en Pascal Objet il y en a quatre : tableaux, enregistrements, ensembles et fichiers) se caractérisent par la multiplicité des éléments qui forment ce type. Chaque élément, à son tour, peut appartenir à un type structuré, ce qui permet de parler d'une éventuelle imbrication de types. Object Pascal autorise une profondeur arbitraire d'imbrication des types, mais la longueur totale de chacun d'entre eux dans la représentation interne ne doit pas dépasser 2 Go.

Pour des raisons de compatibilité avec le Pascal standard, Object Pascal permet de placer un mot réservé avant une déclaration de type structuré emballé, demandant au compilateur de sauvegarder autant que possible la mémoire allouée aux objets de type structuré ; mais le compilateur ignore en fait cette instruction : le « packaging » des données dans Object Pascal se fait automatiquement dans la mesure du possible.

1.2.1 Tableaux

Les tableaux dans Object Pascal sont similaires à bien des égards aux types de données similaires dans d’autres langages de programmation. Particularité les tableaux est que tous leurs composants sont des données du même type (éventuellement structurées). Ces composants peuvent être facilement organisés et chacun d'entre eux est accessible simplement en spécifiant son numéro de série.

La description du type de tableau est spécifiée comme suit :

<имя типа>= tableau[<сп.инд.типов>] de<тип>;

Ici<имя типа>- identifiant correct ; tableau de- mots réservés (tableau, from) ;<сп.инд.типов>- une liste d'un ou plusieurs types d'index, séparés par des virgules ; les crochets encadrant la liste sont une exigence de syntaxe ;<тип>- tout type de Pascal Objet.

Tous les types ordinaux d'une capacité ne dépassant pas 2 Go peuvent être utilisés comme types d'index dans Object Pascal (c'est-à-dire, sauf Mot Long Et Int64)

La profondeur d'imbrication des types structurés en général et, par conséquent, des tableaux est arbitraire, donc le nombre d'éléments dans la liste des types d'index (taille du tableau) n'est pas limité, cependant, la longueur totale de la représentation interne de tout la baie ne peut pas dépasser 2 Go. Dans la mémoire du PC, les éléments du tableau se succèdent de telle manière que lors du passage des adresses basses aux adresses élevées, l'index le plus à droite du tableau change le plus rapidement.

En Pascal Objet, vous pouvez utiliser un seul opérateur d'affectation pour transférer tous les éléments d'un tableau vers un autre tableau du même type.

1.2.2 Dossiers

Enregistrer est une structure de données composée d'un nombre fixe de composants appelés champs d'un enregistrement. Contrairement à un tableau, les composants (champs) d’un enregistrement peuvent être de différents types. Pour permettre de faire référence à l'un ou l'autre composant d'un enregistrement, les champs sont nommés.

La structure d'une déclaration de type de publication est :

<имятипа>=enregistrer<сп.полей>fin;

Ici<имя типа>- identifiant correct ; enregistrement/fin- mots réservés (enregistrement, fin) ;<сп.полей>- liste des champs ; est une séquence de sections d'un enregistrement séparées par un point-virgule.

Chaque section d'un enregistrement se compose d'un ou plusieurs identifiants de champ, séparés par des virgules.

Offre cas de, qui ouvre la partie variante, est superficiellement similaire à l'opérateur de sélection correspondant, mais ne joue en fait que le rôle d'une sorte de mot de service désignant le début de la partie variante. C'est pourquoi à la fin de la partie variante, vous ne devez pas mettre fin comme un couple pour cas de. (Comme la partie variante est toujours la dernière de l'enregistrement, elle est toujours suivie de la fin, mais uniquement par paire à enregistrer). Clé de sélection de phrase cas de est effectivement ignoré par le compilateur : la seule exigence en Pascal Objet est que la clé définisse un type ordinal standard ou prédéclaré.

Les noms de champs doivent être uniques dans l'enregistrement dans lequel ils sont déclarés. Cependant, si les enregistrements contiennent des champs d'enregistrement, c'est-à-dire imbriqués les uns dans les autres, les noms peuvent être répétés sur différents niveaux pièces jointes.

1.2.3 Ensembles

Ensembles - ce sont des ensembles d'objets du même type logiquement liés les uns aux autres. La nature des relations entre les objets est uniquement implicite par le programmeur et n'est en aucun cas contrôlée par Object Pascal. Le nombre d'éléments inclus dans un ensemble peut varier de 0 à 256 (un ensemble qui ne contient pas d'éléments est dit vide). C'est l'inconstance du nombre de leurs éléments qui différencie les ensembles des tableaux et des enregistrements.

Deux ensembles sont considérés comme équivalents si et seulement si tous leurs éléments sont identiques et que l'ordre des éléments dans l'ensemble est indifférent. Si tous les éléments d’un ensemble sont également inclus dans un autre, le premier ensemble est dit inclus dans le second. Un ensemble vide est inclus dans tout autre ensemble.

La description du type d'ensemble est :

<имя типа>= ensemble de<базовый тип>;

Ici<имя типа>- identifiant correct ; ensemble de- mots réservés (ensemble, de) ;<базовый тип>- le type de base des éléments de l'ensemble, qui peut être n'importe quel type ordinal, sauf Mot, entier, entier long, Int64 .

Pour définir un ensemble, on utilise ce qu'on appelle le constructeur d'ensemble : une liste de spécifications des éléments de l'ensemble, séparées par des virgules ; la liste est entourée de crochets. Les spécifications d’éléments peuvent être des constantes ou des expressions d’un type de base, ou un type de plage du même type de base.

La structure interne de l'ensemble est telle que chacun de ses éléments se voit attribuer un chiffre binaire (un bit) ; si un élément est inclus dans l'ensemble, le chiffre correspondant a la valeur 1, sinon - 0. En même temps unité minimale la mémoire est un octet contenant 8 bits, le compilateur a donc alloué un octet aux ensembles et, par conséquent, la capacité de chacun d'eux est devenue égale à 8 éléments. La capacité maximale de l'ensemble est de 256 éléments. Pour de tels ensembles, le compilateur alloue 16 octets adjacents.

Et encore une expérience : changez la plage du type de base en 1..256. Bien que la capacité de ce type soit de 256 éléments, lors de la tentative de compilation d'un programme, le compilateur signalera l'erreur : Les ensembles peuvent avoir au plus 256 éléments car la numérotation des éléments de l'ensemble commence à zéro quelle que soit la limite inférieure déclarée dans le programme. Le compilateur permet l'utilisation comme type de base d'un type plage entière avec une limite minimale de 0 et un maximum de 255, ou de tout type énuméré ne comportant pas plus de 256 éléments (la cardinalité maximale d'un type énuméré est de 65 536 éléments).

1.3 Chaînes

Les types suivants sont utilisés pour le traitement de texte dans Object Pascal :

chaîne courte chaîne courte ou chaîne [n], où n<= 255;

longue chaîne chaîne ;

ligne large Chaîne large ;

chaîne de terminal nul pchar .

Ce que ces types ont en commun, c'est que chaque chaîne est traitée comme un tableau unidimensionnel de caractères, dont le nombre de caractères peut changer dans un programme en cours d'exécution : pour la chaîne [n], la longueur de la chaîne passe de 0 à n, pour chaîne Et pchar- de 0 à 2 Go.

Le Pascal standard utilise uniquement des chaînes courtes Chaîne [n]. En mémoire, une telle chaîne se voit attribuer n+i octets, le premier octet contient la longueur actuelle de la chaîne et les caractères eux-mêmes sont localisés à partir du 2ème octet. Étant donné que la longueur de la chaîne dans ce cas est d'un octet, la longueur maximale d'une chaîne courte ne peut pas dépasser 255 caractères. Le type standard est utilisé pour déclarer une chaîne courte de longueur maximale Chaîne courte(équivalent Chaîne).

Windows utilise largement des chaînes à terminal nul, qui sont des chaînes de caractères délimitées par le caractère #o. La longueur maximale d'une telle chaîne n'est limitée que par la mémoire disponible et peut être très grande.

Un nouveau type a été introduit dans les versions 32 bits de Delphi chaîne, combinant les commodités des deux types. Lorsque vous travaillez avec ce type, la mémoire est allouée selon les besoins (dynamiquement) et est limitée par la mémoire disponible pour le programme.

1.4 Pointeurs et mémoire dynamique

1.4.1 Mémoire dynamique

Mémoire dynamique- il s'agit de la RAM PC fournie au programme lors de son fonctionnement. Le placement dynamique des données signifie l'utilisation de la mémoire dynamique directement pendant l'exécution du programme. En revanche, l'allocation statique est effectuée par le compilateur Object Pascal lors de la compilation du programme. Avec le placement dynamique, ni le type ni la quantité de données à placer ne sont connus à l'avance.

1.4.2 Panneaux indicateurs

La RAM PC est un ensemble de cellules pour stocker des informations - des octets, chacun ayant son propre numéro. Ces numéros sont appelés adresses, ils permettent d'accéder à n'importe quel octet de mémoire. Object Pascal fournit au programmeur un moyen flexible de gérer la mémoire dynamique - ce qu'on appelle les pointeurs. Un pointeur est une variable qui contient l’adresse d’un octet de mémoire comme valeur. À l’aide de pointeurs, vous pouvez placer n’importe quel type de données connu en Pascal Objet dans la mémoire dynamique. Seulement certains d'entre eux ( Octet, Char, ShortInt, Booléen) occupent un octet dans la représentation interne, le reste - plusieurs octets adjacents. Par conséquent, le pointeur n’adresse en réalité que le premier octet de données.

Généralement, un pointeur est associé à un type de données. Nous appellerons ces pointeurs typés. Pour déclarer un pointeur typé, utilisez l'icône ^, qui est placée devant le type correspondant.

En Pascal Objet, vous pouvez déclarer un pointeur sans avoir à l'associer à un type de données spécifique. Le type standard est utilisé pour cela aiguille, Par exemple:

Les pointeurs de ce type seront appelés non typés. Étant donné que les pointeurs non typés ne sont pas associés à un type spécifique, ils peuvent être utilisés pour allouer dynamiquement des données dont la structure et le type changent au fur et à mesure de l'exécution du programme.

Comme déjà mentionné, les valeurs des pointeurs sont les adresses des variables en mémoire, on peut donc s'attendre à ce que la valeur d'un pointeur puisse être transmise à un autre. En fait, ce n'est pas vrai. En Pascal Objet, vous ne pouvez transmettre des valeurs qu'entre des pointeurs associés au même type de données.

1.4.3 Allocation et libération de mémoire dynamique

Toute la mémoire dynamique dans Object Pascal est traitée comme un tableau continu d'octets, appelé tas.

La mémoire pour toute variable allouée dynamiquement est allouée par la procédure New. Le paramètre pour appeler cette procédure est un pointeur typé. Suite à l'accès, le pointeur acquiert une valeur correspondant à l'adresse à partir de laquelle les données peuvent être placées. La valeur vers laquelle pointe le pointeur, c'est-à-dire les données réelles allouées au tas, est indiquée par le signe ^, placé immédiatement après le pointeur. S'il n'y a pas de signe ^ après le pointeur, cela signifie l'adresse où se trouvent les données. Il est logique de repenser à ce qui vient d'être dit : la valeur de tout pointeur est une adresse, et pour indiquer qu'on ne parle pas de l'adresse, mais des données qui se trouvent à cette adresse, un ^ est placé après le pointeur (parfois appelé pointeur de déréférencement).

Les données allouées dynamiquement peuvent être utilisées n'importe où dans le programme où elles sont valides pour les constantes et les variables du type approprié.

La mémoire dynamique peut non seulement être extraite du tas, mais également restituée. Pour ce faire, utilisez la procédure Dispose. Par exemple, les opérateurs

Disposer(pJ);

Disposer(pR);

renverra au tas la mémoire qui était précédemment attribuée aux pointeurs pJ et pR (voir ci-dessus).

Notez que la procédure Dispose (pPtr) ne modifie pas la valeur du pointeur pPtr, mais renvoie uniquement la mémoire précédemment associée à ce pointeur au tas. Cependant, réappliquer la procédure à un pointeur libre entraînera une erreur d’exécution. Le programmeur peut marquer le pointeur libéré avec le mot réservé nul.

1.5 Tapez les alias

Pour n'importe quel type, vous pouvez déclarer autant d'alias que vous le souhaitez. Par exemple:

TMyInteger = Entier ;

À l’avenir, l’alias pourra être utilisé de la même manière que le type de base :

Mylnt : TMyInteger ;

Mylnt := 2*Round(pi);

Ces types d'alias sont généralement utilisés pour améliorer la visibilité du code du programme. Cependant, en Pascal Objet vous pouvez déclarer des alias fortement typés en ajoutant le mot réservé type avant le nom du type de base :

TMyIntegerType = tapez Entier ;

MylntVar : TMyIntegerType ;

Du point de vue du compilateur, les alias typés sont compatibles avec le type de base dans différents types d'expressions, mais ils déclarent en fait un nouveau type de données, ils ne peuvent donc pas être utilisés comme paramètres formels pour appeler des sous-programmes à la place du type de base. Si par exemple une procédure est déclarée

function MylntFunc(APar : entier) : Entier ;

alors un tel appel à elle

MylntFunc(MylntVar)

sera considéré comme erroné par le compilateur.

Les alias fortement typés obligent le compilateur à générer des informations de type d'exécution (RTTI). Ces informations sont généralement utilisées par l'environnement Delphi pour prendre en charge le fonctionnement de différents types d'éditeurs.

Bases de la programmation
Chaque professionnel était autrefois une théière. Vous connaissez sûrement l’état où « vous ne savez pas par où commencer à réfléchir pour arriver à une telle chose ». Vous avez probablement rencontré une situation dans laquelle vous ne savez tout simplement pas par où commencer. Ce livre s'adresse précisément aux personnes qui aimeraient devenir programmeur, mais qui n'ont absolument aucune idée par où commencer dans cette voie. ...

Presque tous les types de données entiers sont . Ces types de données représentent des entiers dans une certaine plage. Les noms spécifiques des types entiers et des plages de valeurs dépendent du langage de programmation spécifique, du compilateur et du mode de compilation. Vous pouvez en savoir plus à ce sujet dans la documentation du compilateur.

Par exemple, le type de données Entier en Delphi, sa plage est comprise entre -2147483648…2147483647, tandis qu'en Turbo Pascal, le type de données Entier représente des nombres compris entre -35 768 et 32 ​​767. En Free Pascal, la plage de valeurs de type Entier déterminé par le mode sélectionné.

Puisque Lazarus utilise le compilateur Free Pascal, tout ce qui est dit sur les types de données en relation avec Free Pascal est également vrai pour Lazarus.

Ainsi, les types de données entiers de Free Pascal sont répertoriés dans le tableau 13.1.

Tableau 13.1. Types de données entiers Pascal gratuits (Lazarus).

Taper Taille, octets Plage de valeurs
Octet 1 0…255
Raccourci 1 -128…127
Petitint 2 -35768…32767
Mot 2 0…65535
Entier 2 ou 4 Dépend du mode de compilation
Cardinal 4 0…4294967295
Entier long 4 -2147483648…2147483647
Mot long 4 0...4294967295
Int64 8 -9223372036854775808...9223372036854775807
QMot 8 0...18446744073709551615

NOTE
Types en Pascal Libre Int64 Et QMot ne sont pas! Cela signifie que vous ne pouvez pas les utiliser, par exemple, pour les variables d'index dans les boucles. Cependant, je les ai présentés ici afin de ne pas les décrire séparément à l'avenir et de rassembler tous les types entiers Free Pascal en un seul endroit. Si vous ne comprenez pas certains mots, ne vous inquiétez pas. En temps voulu, je vous raconterai tout plus en détail.

Et maintenant quelques explications sur le tableau.

Dans une chronique TAPER des identifiants de type de données sont donnés (des mots clés qui indiquent au compilateur à quel type appartient une donnée particulière). Vous apprendrez à utiliser ces identifiants dans les leçons suivantes.

Dans une chronique TAILLE indique la taille qu'occupe le type de données dans la mémoire de l'ordinateur. Par exemple, un entier positif peut être représenté par différents types : Octet, Mot, Cardinal etc. Cependant, un nombre comme Cardinal occupera 4 octets en mémoire, tandis qu'un nombre comme Octet– seulement 1 octet. Par conséquent, si vous savez avec certitude que le nombre avec lequel vous travaillez ne prendra jamais une valeur supérieure à 255, alors il est préférable de le définir comme un type Octet, car cela permettra d'économiser de l'espace dans la mémoire de votre ordinateur. Bien que tout ne soit pas si simple ici (les nuances de la répartition de la mémoire et des autres ressources informatiques dépassent le cadre).

Dans une chronique GAMME spécifie la plage de valeurs sur laquelle le type de données opère. Par exemple, un nombre comme Octet peut prendre des valeurs de 0 à 255.

Maintenant, place à la pratique. Écrivons un programme qui affiche les plages de valeurs de tous les types de données entières. Le code source de ce programme est donné ci-dessous :

Inscription 13.1. Un programme pour afficher des plages d'entiers. programme td; ($mode objfpc)($H+) utilise ($IFDEF UNIX)($IFDEF UseCThreads) cthreads, ($ENDIF)($ENDIF) classes (vous pouvez ajouter des unités après cela) ; commencer Writeln("Octet : ", Low(Octet), "..", High(Octet)); Writeln("Abréviation : ", Faible(Abréviation), "..", Élevé(Abréviation)); Writeln("Smallint : ", Low(Smallint), "..", High(Smallint)); Writeln("Mot : ", Faible(Mot), "..", Élevé(Mot)); Writeln("Entier : ", Faible(Entier), "..", Élevé(Entier)); Writeln("Cardinal : ", Faible(Cardinal), "..", Haut(Cardinal)); Writeln("Entier Long : ", Faible(Entier Long), "..", Haut(Entier Long)); Writeln("Mot long : ", Faible(Mot long), "..", Haut(Mot long)); Writeln("Int64 : ", Faible(Int64), "..", Élevé(Int64)); Writeln("QWord : ", Faible(QWord), "..", Élevé(QWord)); Lire ; fin.

Fonction standard Faible définit la valeur minimale du type de données. Funtskia Haut définit la valeur maximale. Avec fonctions ÉcrireLn Et LireLn vous vous connaissez déjà un peu. Nous parlerons plus en détail des sous-programmes (procédures et fonctions) dans la section correspondante.

Enfin, je vais vous expliquer comment les données entières sont écrites dans le programme. Oui, comme partout ailleurs : écrivez simplement le numéro, sans guillemets ni symboles supplémentaires. Par exemple, comme ça

10
178
35278

Certes, cela s'applique aux nombres dans le système numérique décimal. Vous savez sûrement déjà qu’il existe d’autres systèmes. Les systèmes numériques les plus utilisés sont le binaire, le décimal et l’hexadécimal.

Free Pascal prend en charge quatre formats d'entiers :

  1. Notation décimale. Juste un chiffre, comme 10.
  2. Notation hexadécimale. Un numéro préfixé par $. Par exemple, le nombre hexadécimal $10 est égal au nombre décimal 16.
  3. Notation octale. Un numéro préfixé par &. Par exemple, l'octal &10 est égal au décimal 8.
  4. Notation binaire. Un nombre préfixé par %. Par exemple, le nombre binaire %10 est égal au nombre décimal 2.

Devoirs:

Créez un programme qui affiche des plages de valeurs entières (liste 13.1). Compilez le programme et exécutez-le. Assurez-vous que ces valeurs correspondent à celles indiquées dans le tableau 13.1.

Dans le code source du programme, recherchez la ligne qui définit le mode de compilation :

($mode objfpc)($H+)

Dans cette ligne, au lieu du mot objfpcécrire le mot tp. Autrement dit, la dernière ligne devrait ressembler à ceci :

($mode tp)($H+)

Lancer le programme. Regardez la plage de valeurs de type Entier. Conclure.

Apprenez à penser comme un programmeur, c'est-à-dire logiquement. Personne ne mâchera tout à votre place jusqu’à la retraite, comme je le fais maintenant. Il faut s'habituer à penser par soi-même. Sinon, vous tomberez dans le « principe d’apprentissage du singe » et vos chances de devenir un grand programmeur seront alors proches de zéro. Pour vous aider à ne pas tomber dans le niveau « bachotage », je laisserai périodiquement des lacunes dans votre apprentissage afin que vous essayiez de comprendre certaines choses vous-même.

C'est bien mieux si tu le découvres toi-même mauvaise décision, vous trouverez l’erreur vous-même et la corrigerez vous-même, plutôt que de toujours utiliser les bonnes solutions des autres et de les copier bêtement.