IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

 Delphi Discussion :

Manipulation des pointeurs sur des array of record


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Par défaut Manipulation des pointeurs sur des array of record
    Bonjour tout le monde,

    Je suis un débutant Delphi. Je dois manipuler des pointeurs pour
    un projet et je suis un peu perdu sur les pointeurs, je veux donc faire
    appel à vous experts, pour résoudre mon problème.

    - Je déclare un "record" Tparameter en définissant les différents champs.
    - Je déclare un pointeur sur mon Tparameter.
    - Je déclare un Array "TabParameter" sur mon Tparameter *
    - Je déclare un Pointeur PParameters, qui pointe sur TabParameter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    type
      TParameter = record
          A:string;
          B:Int64;
          C:single;
          D:Boolean;
          end;
      PParameter = ^TParameter;
      Tabparameter = Array of Tparameter;
      PParameters = ^Tabparameter;
     
    private
    Parameter1 : Array of Tparameter;
    Je crée une procédure proc1 avec pour paramètre le pointeur PStructure de type Pparameters. Je crée ensuite dans le code tout ce qu'il faut pour remplir ma PStructure avec l'instruction With PStructure^[i] Do:

    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
     
    procedure proc1(PStructure: Pparameters;FileName:string);
     
    var i:word;
         E,F,G,H,I:string;
     
    i:=length(PStructure^);
    SetLength(PStructure^,i+1);
      With PStructure^[i] Do
      Begin
        E:='toto';
        F:='titi';
        G:='tata';
        H:='tutu';
        I:='tyty';
      end;
    end;
    J'appelle à partir d'une autre procédure la procédure proc1 en lui passant en paramètre l'adresse de Parameter1 (qui est de type array of Tparameter)

    Proc1(@Parameter1,'fichier_texte.txt');

    Ce code marche très bien et ne provoque aucune erreur.

    Voici mon problème :
    => Une fois la procédure Proc1 appelée, je voudrai exploiter les enregistrements récupérés dans Parameter1. Quand j'utilise l'évaluation en mode débuggage, j'obtiens : (('toto', 'titi', 'tata', 'tutu', 'tyty'))

    Je voudrai par exemple récupérer la valeur du champ F de PStructure.

    Je suis débutant, je reprends ce code qui a déjà été fait par un expert.

    Cela peut vous paraître trop facile, mais moi je suis bloqué.

    Merci beaucoup pour votre aide.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Citation Envoyé par kracter56 Voir le message
    => Une fois la procédure Proc1 appelée, je voudrai exploiter les enregistrements récupérés dans Parameter1. Quand j'utilise l'évaluation en mode débuggage, j'obtiens : (('toto', 'titi', 'tata', 'tutu', 'tyty'))

    Je voudrai par exemple récupérer la valeur du champ F de PStructure.
    je suppose que tu as fais une erreur de copie sur le forum du type TParameter, partons sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     TParameter = record
          E,F,G,H,I:string;
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Proc1(@Parameter1,'fichier_texte.txt');
      for i := Low(Parameter1^) to High(Parameter1^) do
        ShowMessage(Parameter1^[i].F);
    TParameter très mal choisi d'ailleurs comme nom de type, car existe déjà dans ADODB, passons !

    Dans Proc1, les variables locales E,F,G,H,I:string; sont inutiles ou alors, il y a une grosse méprise sur le type TParameter et l'opérateur with


    D'autres considérations comme PParameters qui est un peu poussé, cela fait un pointeur de pointeur (puisque le tableau dynamique est déjà un pointeur)

    tu peux le simplifier en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure proc1(var Structure: Tabparameter;FileName:string);
    ...
    juste les ^ a enlevé dans Proc1 et l'appel se simplifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Proc1(Parameter1,'fichier_texte.txt');
    le type PParameter n'est pas utilisé !

    En fait, il n'y aucun pointeur utile dans code !
    Tu devrais nous proposer le VRAI code et non une version censurée (cela se comprend) car tu dois au passage fait de mauvaise interprétation

    qui se résume donc à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    type
      TParameter = record
        A: string;
        B: Int64;
        C: Single;
        D: Boolean;
      end;
      Tabparameter = Array of Tparameter;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private
      Parameter1 : Tabparameter ; // autant utilisé le même type !
    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
    procedure proc1(var Structure: Tabparameter; const FileName: string);
    var
      LastIndex: Integer;
    begin
      // FileName ????
     
      // Agrandissement du Tableau d'une case !
      LastIndex := Length(Structure);
      SetLength(Structure, LastIndex + 1);
     
      with Structure[LastIndex] Do
      Begin
        A := 'toto';
        B := MaxInt * 10;
        C := 1.01;
        D := True;
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éclairé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 83
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 777
    Par défaut
    Que ta procédure de chargement fonctionne bien, cela n'est pas surprenant, vue que ........ tu n'y fais rien . Enfin certainement pas un chargement.

    Regarde bien ton code : tu déclares A dans ton record en string et tu mets 'toto' dans E. A ne reçoit rien. Ensuite, si tu souhaites mettre des nombres dans B, un ordre B := 'titi' ne va pas bien passer. Ou alors tu ne charges que la zone A, et il manque une boucle dans ta procédure de chargement.

    Voici déjà une correction pour charger A :

    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
    procedure TForm1.proc1(PStructure: Pparameters;FileName:string);
     
    var i:word;
     
    begin
    i:=length(PStructure^);
    SetLength(PStructure^,i+1);
      With PStructure^[i] Do
      Begin
        A:='toto';
        B:=5;
        C:=9;
        D:=true;
      end;
    end;
    Si tu récupères des données d'un fichier texte, je suppose que seule la zone A sera traitée, et dans ce cas, les lignes B, C, D sont à ignorer. Mais une description plus poussée du programme serait bien venue

    Enfin, pour traiter ce cas de figure où il n'y a qu'une seule passe de chargement, voila comment récupérer la valeur de A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button1Click(Sender: TObject);
    var E : string;
         j : integer;
    begin
       Proc1(@Parameter1,'fichier_texte.txt');
       j := 0;
       E := Parameter1[j].A;
       ShowMessage(e);
    end;
    Pense aussi à récupérer la valeur de I qui te donne le nombre de postes dans ton Array


  4. #4
    Membre éclairé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 83
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 777
    Par défaut
    Aiiiiiiii le Troll, toujours le plus rapide !!!

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Par défaut
    Merci beaucoup pour vos réponses et pour votre expertise, j'ai réussi à m'en sortir.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Pense au bouton , en bas à droite de la page
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Par défaut
    Merci à vous tous pour vos réponses.

    > ShaiLeTroll et JP.NUAGE : Vos conseils m'ont servi pour d'autres parties de mon code, mais pour une raison de confidentialité je ne peux malheureusement pas poster mon code d'origine. De plus, comme je travaille sur du code existant, je ne dois pas me passer des différents pointeurs qui m'ont été imposés. (Eh oui, c'est un peu le souci quand on reprend un projet en plein milieu ).

    Par contre, j'ai trouvé la réponse moi-même à mon problème, il s'agissait de récupérer la valeur en faisant Parameter1[indice].champ.

    Exemple : Pour appeler l'indice 7 de la valeur du champ nom dans Parameter1, il fallait écrire Parameter1[7].nom.

    Voilà j'ai posté cette réponse pour aider éventuellement d'autres personnes qui rencontreraient dans le futur le même type de problème.

    Je mets donc ce souci comme résolu.

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Citation Envoyé par kracter56 Voir le message
    Exemple : Pour appeler l'indice 7 de la valeur du champ nom dans Parameter1, il fallait écrire Parameter1[7].nom.
    Ah OK, tu es très débutant, cela doit s'écrire de la même façon en C, C++, JavaScript ou PHP ([7]->)

    Tu devrais peut-être changé ton intitulé "Ingénieur développement logiciels" en "Etudiant en développement logiciel", on ne propose pas les mêmes réponses à un professionnel qui maîtrise d'autre langages à un étudiant qui débute !

    Je pense qu'il est important de lire ceci Guide Pascal et Delphi - VII-G-1. Vue d'ensemble sur les enregistrements, dont voici un extrait

    Citation Envoyé par Frédéric Beaulieu
    Le type enregistrement n'est évidemment pas un type ordinal, mais par contre, il peut être utilisé dans des tableaux (y compris dynamiques) et dans d'autres types enregistrements. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    type
      TLangueLogiciel = (llInconnue, llFrancais, llAnglais, llAutre);
      TLangue = record
        Code: TLangueLogiciel;
        Nom: string;
      end;
      TLogiciel = record
        Nom,
        Version,
        Auteur: string;
        Langue: TLangue;
        Taille: integer;
      end;
      TTabLogiciel = array of TLogiciel;
    Cet exemple montre déjà des types bien élaborés. Les deux premiers types sont respectivement énumérés et enregistrement. Le troisième ('TLogiciel') utilise comme type d'un de ses membres un type enregistrement. Si nous avions une variable 'Log1' de type 'TLogiciel', il faudrait écrire 'Log1.Langue.Code' pour accéder au code de la langue du logiciel. Le dernier type est encore un peu plus difficile : c'est un tableau dynamique, dont les éléments sont de type 'TLogiciel'. Imaginons que nous ayons une variable de ce type nommée 'Logiciels' : pour accèder au code de la langue du troisième logiciel de ce tableau, il faudrait écrire 'Logiciels[2].Langue.Code'. car 'Logiciels[2]' est de type 'TLogiciel' et 'Logiciels[2].Langue' est donc de type 'TLangue'.

    Ce dernier type vous parait peut-être bien délicat, mais imaginez qu'avec ce type, on peut gèrer sans trop de peine une liste de logiciels, avec leurs particularités respectives, et tout cela avec une seule variable.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 18
    Dernier message: 01/04/2013, 17h07
  2. Comment ajouter des séries dans des graphes sur des feuilles variables
    Par Molomarcopolo dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/07/2012, 16h26
  3. Map contenant des pointeurs sur des fonctions membres
    Par Bash01 dans le forum Débuter
    Réponses: 1
    Dernier message: 18/05/2010, 15h06
  4. Trigger pour mettre des droits sur des procedures et des vues
    Par briino dans le forum Développement
    Réponses: 3
    Dernier message: 23/09/2009, 09h44
  5. vector de pointeurs sur des objet
    Par jean-bobby dans le forum SL & STL
    Réponses: 26
    Dernier message: 06/08/2004, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo