Developpez.com - Rubrique Lazarus

Le Club des Développeurs et IT Pro

POO à gogo - Apprendre la notion d'enregistrements dans Free Pascal et Lazarus partie 1 sur 2

Un tutoriel de Gilles Vasseur

Le 2017-03-28 16:47:22, par gvasseur58, Responsable Lazarus & Pascal
Les enregistrements simples et le compactage



À l'aide de ce tutoriel, vous devriez être capable d'utiliser au mieux les enregistrements dans vos programmes. Les novices apprendront à :

  • définir un type enregistrement simple avec ou sans variantes ;
  • affecter des valeurs à des champs et les retrouver à la demande ;
  • tenir compte des limites des enregistrements ;
  • comprendre les mécanismes régissant le compactage afin de l'utiliser à bon escient.

Ceux qui manipulent déjà bien ces notions trouveront l'occasion de réviser leurs connaissances et de critiquer si nécessaire la présentation qui en est faite.
Dans un tutoriel à suivre prochainement, il sera temps d'aborder les enregistrements étendus introduits par la Programmation Orientée Objet.

http://gilles-vasseur.developpez.com...egistrements1/

Que pensez-vous de ce tutoriel ?
Les enregistrements sont-ils trop connus pour que vous vous y intéressiez ?
  Discussion forum
16 commentaires
  • thewolf
    Membre habitué
    Bonjour. Merci pour ce tutoriel très intéressant.

    Cependant, je ne comprends pas très bien l'exemple de code ci-dessous. Comment se fait le lien entre point1 et Point2 d'une part et MyRect d'autre part ?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    type
      TPoint = record
        X: LongInt;
        Y: LongInt;
      end;
      TRect = record
       case Integer of
         0: (Left,Top,Right,Bottom: Longint);
         1: (TopLeft,BottomRight: TPoint);
      end;
    
    var
      Point1, Point2: TPoint;
      MyRect: TRect;
    […]
    
      Point1.X := 15;
      Point1.Y := 32;
      Point2.X := 125;
      Point2.Y := 232;
      Memo1.Lines.Add(Format('Largeur : %d', [MyRect.BottomRight.X - MyRect.TopLeft.X]));
  • Jipété
    Expert éminent sénior
    Envoyé par gvasseur58
    Que pensez-vous de ce tutoriel ?
    Rhôôô, magnifique !

    Juste un mot :
    Cet ensemble de connaissances va vous permettre à présent d'aborder les enregistrements étendus introduits par la Programmation Orientée Objet : ce sont des outils puissants, pour la plupart rencontrés à l'occasion de la manipulation d'objets, qui s'offrent ainsi aux programmeurs.
    Je n'ai pas trouvé où cliquer pour passer aux enregistrements étendus,
    Ben vi, tu nous mets l'eau à la bouche, là...

    Envoyé par gvasseur58
    Les enregistrements sont-ils trop connus pour que vous vous y intéressiez ?
    Comme Yves : toujours bon de relire certains points même basiques, on en apprend tous les jours (les "packed" avec les petits champs plutôt à la fin, c'est noté !)

    Un dernier mot : précise "record" entre parenthèses après "enregistrements" dans le titre, il m'a fallu un certain temps pour capter qu'on n'allait pas parler magnétophones et multimédia, et oui...
  • gvasseur58
    Responsable Lazarus & Pascal
    Envoyé par Jipété

    Ben vi, tu nous mets l'eau à la bouche, là...
    Je ne suis pas bon commerçant, mais j'apprends à faire languir le chaland . Il faudra patienter un tout petit peu encore...

    Envoyé par Jipété

    Un dernier mot : précise "record" entre parenthèses après "enregistrements" dans le titre, il m'a fallu un certain temps pour capter qu'on n'allait pas parler magnétophones et multimédia, et oui...
    C'est fait .
  • Roland Chastain
    Rédacteur/Modérateur
    Bonjour !

    Excellent article, qui dit tout (me semble-t-il) sur le sujet.

    Il y a une petite correction à faire dans l'exemple suivant :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    uses sysutils;
    type
      TPoint = record
        X: LongInt;
        Y: LongInt;
      end;
      TRect = record
       case Integer of
         0: (Left,Top,Right,Bottom: Longint);
         1: (TopLeft,BottomRight: TPoint);
      end;
    
    var
      Point1, Point2: TPoint;
      MyRect: TRect;
    begin
    
      Point1.X := 15;
      Point1.Y := 32;
      Point2.X := 125;
      Point2.Y := 232;
      WriteLn(Format('Largeur : %d', [MyRect.BottomRight.X - MyRect.TopLeft.X]));
    end.
    Dans l'article il manque MyRect.. Désolé, j'ai loupé la discussion de relecture technique.

    P.-S. Pour les enregistrements avec constructeur, je n'en vois pas l'intérêt mais je suis prêt à changer d'avis en lisant la deuxième partie de l'article.
  • Jon Shannow
    Membre extrêmement actif
    Que pensez-vous de ce tutoriel ? Excellent, comme tous les autres...
    Les enregistrements sont-ils trop connus pour que vous vous y intéressiez ? Y a jamais de mal à revoir les fondamentaux... Et puis, on apprend toujours, même sur un truc qu'on a utilisé et ré-utilisé pendant des décennies.

    Encore merci pour ces excellents tutos... (par contre je passe de 4 à 6 ? Ou est le 5... J'en ai loupé un ? )
  • gvasseur58
    Responsable Lazarus & Pascal
    Envoyé par thewolf
    Bonjour. Merci pour ce tutoriel très intéressant.

    Cependant, je ne comprends pas très bien l'exemple de code ci-dessous. Comment se fait le lien entre point1 et Point2 d'une part et MyRect d'autre part ?
    Bonjour et merci pour les remarques.
    Le lien entre les points Point1 et Point2 est très simple : il n'existe pas. Il s'agit en effet d'une erreur de ma part qui ai laissé un ancien morceau de code .
    Il fallait lire :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    type
      TPoint = record
        X: LongInt;
        Y: LongInt;
      end;
    
      TRect = record
       case Integer of
         0: (Left,Top,Right,Bottom: Longint);
         1: (TopLeft,BottomRight: TPoint);
      end;
    
    var
      MyRect: TRect;
    […]
    
      MyRect.Top := 15;
      MyRect.Left := 32;
      MyRect.Bottom := 125;
      MyRect.Right := 232;
     
      Memo1.Lines.Add(Format('Largeur : %d', [MyRect.BottomRight.X - MyRect.TopLeft.X]));
    Cordialement,

    Gilles
  • tourlourou
    Modérateur
    A priori, la taille d'un Double fait toujours huit octets avec FPC.
    Certes, mais je me suis mal exprimé : j'imaginais qu'il était natif de débuter un Double sur un multiple de 4 octets, en 32 Bits, de la même façon que je vois l'intérêt de le faire démarrer sur un multiple de 8 en 64 Bits, pour une question d'arithmétique de pointeurs et de taille des registres.
  • gvasseur58
    Responsable Lazarus & Pascal
    Envoyé par tourlourou
    Certes, mais je me suis mal exprimé : j'imaginais qu'il était natif de débuter un Double sur un multiple de 4 octets, en 32 Bits, de la même façon que je vois l'intérêt de le faire démarrer sur un multiple de 8 en 64 Bits, pour une question d'arithmétique de pointeurs et de taille des registres.
    Non, non, c'est moi qui ai le cerveau en marmelade . Je constate l'alignement sur un multiple de 8, mais je n'ai pas la réponse technique du pourquoi de ce choix, y compris en 32 bits : est-ce une recherche d'homogénéité du compilateur ? A vérifier...
  • Jon Shannow
    Membre extrêmement actif
    J'avais loupé celui des jeux de dés...
  • droggo
    Expert confirmé
    Bonjour,

    Joli, mais je me dois quand même de rappeler que les Record et leur manipulation n'ont rien à voir avec la POO