Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Pointer tous les champs d'un Record


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Pointer tous les champs d'un Record
    Bonjour
    imaginons que j'ai un 'record'

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Type
      TpListeDeValeur = Record
        A1   : Integer;
        A2   : Single; 
        A3   : byte;
      end;
     
      TpMinMax = Record
        Min : TpListeDeValeur;
        Max: TpListeDeValeur;
      end;


    puis un tableau regroupant des valeurs

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    var 
      TbValeur : array[1..100] of TpListeDeValeur;
      MinMax   : TpMinMax;


    le but est de calculer le minimum et le maximum des valeurs de A1, A2 et A3.
    et si je rajoute un jour A4, que la routine tourne sans modification du code.

    y a t'il un moyen de pointer tous les champs d'un 'record' automatiquement, comme les champs d'un tableau ?

    Merci pour le temps que vous passez à nous lire et à nous corriger.
    c'est très apprécié.
    bonne journée

  2. #2
    Modérateur

    Non...

    Pour rester au niveau de l'enregistrement, on peut passer par un record helper qui fournirait une méthode CompareAuxExtremes qui serait redéfinie à chaque modification des champs.
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre du Club
    Changement de Structure ?
    Bonjour,
    merci pour la réponse.
    y aurait t'il alors une autre structure qui me permettrait de résoudre le problème ?

    bonne journée

  4. #4
    Modérateur

    Un tableau de tableau de variants ? La longueur du tableau de variants et le type de ses éléments dépendrait du record à reproduire.
    Mais la procédure devrait sûrement tester beaucoup de cas pour être générique, et surtout, au lieu d'être connue comme un type, la structure des données devrait l'être de la procédure d'affectation des données.
    Voici une belle usine à gaz en perspective.
    D'où vient le besoin ? N'y a-t-il pas moyen de faire autrement ?
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre expert
    Salut pour réaliser ce que tu souhaites ta structure est trop rigide et comme le suggères tourlourou, il te faudra implémenter de nouvelles méthodes à chaque fois que tu ajoutes une valeur.

    Comme ça à chaud je passerai par plusieurs enregistrements et des tableaux dynamique (ou flux mémoire) :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Type
      TVarType = (vtByte, vtWord, vtInteger, vtDWord, vtInt64, vtSingle, vtDouble);
      TValeur = record
        Valeur : Variant;
        ValeurType : TVarType;
      end;
     
      TTableauValeur = Array of TValeur;
     
      TValeurMinMax = record
        mini : TValeur;
        maxi : TValeur;
      end;
     
      TListeValeurMinMax = Array of TValeurMinMax
     
      TListeDeValeur = Record
        nbValeur : Word;
        TableauValeur : TTableauValeur;
      end;
     
    var 
      TbValeur :  Array of TListeDeValeur;
      TbMinMax :  Array of TListeValeurMinMax; // grandeur en fonction de TbValeur.nbValeur


    Il te suffira de coder une méthode en fonction du nombre de valeur présent dans TListeValeur et de transtyper "Valeur" dans TValeur en fonction du type

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Membre du Club
    paramètres d'un radar
    Mon tableau, c'est en fait les paramètres d'un radar.
    chaque élément de ce tableau représente une impulsion de ce radar.
    chaque impulsion est représenté par ses paramètres:
    - sa fréquence, (que j'avais noté A1)
    - sa durée d'impulsion, (A2)
    - le niveau de cette impulsion, (A3)
    - etc ...

    mon tableau peut représenter des millions d'impulsions, d’où ma réticence à passer les champs en variant qui occuperait beaucoup plus de place en mémoire.

    et comme des paramètres peuvent s'ajouter, le tableau (ses champs) peut évoluer.

  7. #7
    Membre expert
    Nos messages et pensées se sont croisé Tourlourou

    Connais tu exactement le nombre de paramètres à prendre en compte suivant le "type" de radar ?

    Pour ma part, dans ce cas, à la place de passer par des enregistrement je passerai pas des "classes"et des listes de classes (dans le genre TList ou TCollection) ce qui permettrai de les étendre plus facilement grâce à l'héritage et le polymorphisme. cf les articles de Gilles Vasseur dans les tutoriels avancés : POO à gogo 1ere partie

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  8. #8
    Membre du Club
    Connaissance des paramètres
    Bonjour.
    J'ai des paramètres principaux qui sont toujours présents,
    mais d'autres peuvent se rajouter.
    Je vais essayer effectivement d'implémenter des classes.
    merci pour vos réponses.
    bonne journée

  9. #9
    Expert éminent sénior
    Bonjour,

    la seule façon de la faire en automatique c'est par les RTTI

    sous Delphi j'utilise mon unité Execute.RTTI
    https://github.com/tothpaul/DelphiAC...ecute.RTTI.pas

    il manque une fonction pour parcourir les membres vu que je n'ai jamais eu ce besoin mais c'est facile à faire en regardant RecordFieldByName() tu peux facilement retrouver le nième champ, après avec un "case TypeData.OrdType of" tu peux savoir si c'est un ordinal (cf GetOrd) ou un Float, tu peux voir dans SetValue() comment écrire la valeur...la lecture se faire de la même façon mais dans l'autre sens

    je ne sais pas sous Lazarus, mais sous Delphi il y a un aussi l'unité System.RTTI qui permet de faire la même, mais je ne la trouve pas pratique
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

###raw>template_hook.ano_emploi###