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

Langage Delphi Discussion :

Problème sur un pointeur dans une structure


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut Problème sur un pointeur dans une structure
    Bonjour à tous,

    J'utilise une structure qui s'appelle elle-même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    type
      S_FORMAT_DESCRIPTION = record
          field_name : array [0..LG_254] of char;  
          ...      
          fils : pointer;       // subfield
          suivant : pointer; // next field or next possible value description
    end;
    type ptr_S_FORMAT_DESCRIPTION = ^S_FORMAT_DESCRIPTION;
    En C, les variables 'fils' et 'suivant' auraient eu comme type : 'ptr_S_FORMAT_DESCRIPTION'.
    Là je suis obligé de leur mettre un type 'pointer'.

    Dans le code je me déclare une variable de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    S_FORM_DESC : ptr_S_FORMAT_DESCRIPTION;
    J'accède aux données via le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    S_FORM_DESC^.field_name
    Jusque là c'est ok.

    Là où ça se corse, c'est quand je veux accèder aux données du 'fils'.
    Comment faut-il faire ???
    Le code suivant ne marche pas et n'est pas bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    S_FORM_DESC^.fils^.field_name
    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 577
    Points : 25 217
    Points
    25 217
    Par défaut
    Effectivement, j'ai eu ce problème aussi pour des pointeurs de procédure et structure voir ICI

    pour toi, c'est juste une astuce de déclaration qui ne fonctione que pour ce cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    type
      ptr_S_FORMAT_DESCRIPTION = ^S_FORMAT_DESCRIPTION;
      S_FORMAT_DESCRIPTION = record
          field_name : array [0..LG_254] of char;  
          ...      
          fils : ptr_S_FORMAT_DESCRIPTION;       // subfield
          suivant : ptr_S_FORMAT_DESCRIPTION; // next field or next possible value description
    end;
    Sinon pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    S_FORM_DESC^.fils^.field_name
    avec les pointer, il suffit de caster ( je ne donne ça que pour l'exemple, avec la forme de déclaration ci dessus, plus besoin biensur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptr_S_FORMAT_DESCRIPTION(S_FORM_DESC^.fils)^.field_name

  3. #3
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Aussi, en Pascal, il est d'usage de ne pas mettre le ^ lorsqu'il est suivi d'un point (.) ; d'autre part, pour déclarer un type pointeur, on ne précède pas le nom de ptr_ mais d'un simple P. Enfin, les types non pointeurs sont précédés d'un T.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type
      PSFormatException = ^TSFormatException;
      TSFormatException = record
        FieldName: array[0..LG_254] of Char;
        ...
        Fils: PSFormatException;
        Suivant: PSFormatException;
      end;
     
    SFormDesc.Fils.FieldName

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 577
    Points : 25 217
    Points
    25 217
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Aussi, en Pascal, il est d'usage de ne pas mettre le ^ lorsqu'il est suivi d'un point (.)
    Ah, Bon ?
    Pourtant dans bcp de code Borland tu le vois !
    Comme dans
    - TStringList.ExchangeItems
    - l"unité TypInfo, avec même des "^^."

    Pour le nommage entièrement d'accord avec sjrd, je n'ai pas fait la correction pour ne pas compliquer l'affaire dans un premier temps mais steph_1, si tu as le courage, faudrait renommer tes types ...

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    En fait on utilise ^. lorsqu'il n'est pas clair à la lecture ce que le seul . signifie. Mais ça n'arrive pas si souvent. TypInfo évidemment n'est pas clair du tout avec ^. qui signifie ^^. donc ils mettent toujours les deux.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 577
    Points : 25 217
    Points
    25 217
    Par défaut
    Je ne sais pas, perso, j'aime savoir que j'utilise un pointeur quand je relis mon code quelques mois plus tard et que j'ai travaillé sur plusieurs projets, donc oublié bcp de chose, et personnellement, les ^. et ^^. ne me pertube pas, d'ailleurs, cela m'a permis d'utiliser à fond les RTTI en étudiant le code de TypInfo

    Dans beaucoup de cours Delphi, il laisse les ^ explicites, sinon on ne mélange vite ...

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

Discussions similaires

  1. problèmes sur un combobox dans une classe appelée
    Par francky74 dans le forum JDBC
    Réponses: 9
    Dernier message: 02/04/2014, 13h09
  2. Réponses: 4
    Dernier message: 17/07/2011, 22h31
  3. question sur les pointeurs dans les structures!
    Par bilal_sayed1 dans le forum Débuter
    Réponses: 1
    Dernier message: 19/02/2010, 07h33
  4. Réponses: 2
    Dernier message: 26/11/2006, 10h51
  5. Réponses: 7
    Dernier message: 21/12/2005, 16h44

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