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 avec les pointeurs !


Sujet :

Langage Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 410
    Points : 307
    Points
    307
    Par défaut Problème avec les pointeurs !
    Bonjour,
    J'ai besoin de traiter avec un pointeur et je n'y arrive pas !
    J'ai un objet bâti ainsi pour la partie qui m'interpelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      private
        FData: array of byte;
        function GetData: pointer;
        function GetDataLength: integer;
      public
        property Data: pointer read GetData;
        property DataLength: integer read GetDataLength;
    J'ai besoin de traiter les données contenues dans FData.
    Data est donc un pointeur sur FData et il a la valeur @FData[0].

    Pour traiter les données j'ai essayé unbyte:=Profile.Data^[0]; pour aller récupérer le x ième byte du tableau, ou unbyte:=Profile.Data[x] il parait que le ^ est implicite.
    Mais à la compilation j'ai l'erreur E2016 Type tableau requis.
    Comment je peux récupérer le contenu de FData pour le mettre dans un tableau local voir un TmemoryStream ?
    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 754
    Points : 13 340
    Points
    13 340
    Par défaut
    Citation Envoyé par Bernard B Voir le message
    Data est donc un pointeur sur FData et il a la valeur @FData[0].
    Ce qui est en soi inutile. FData est déclaré en tableau dynamique. FData est donc déjà un pointeur sur le premier élément.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function TForm1.GetData: pointer;
    begin
      //Result := @FData[0];
      Result := FData;
    end;
    Citation Envoyé par Bernard B Voir le message
    Mais à la compilation j'ai l'erreur E2016 Type tableau requis.
    C'est parce que Data est déclaré en pointeur non typé (pointer), le compilateur ne peut pas savoir qu'un tableau se loge à cette adresse.
    Il faut pour cela transtyper le pointeur dans un type connu. Par exemple : unbyte := PByteArray(Profile.Data)[x].

    Mais perso, je déclarerais plutôt un nouveau type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      TDataType = array of byte;
     
      TProfil = class
      private
        FData: TDataType;
      public
        property Data: TDataType read FData;
      end;
    A noter encore que Data est en lecture seule mais cela ne concerne que le pointeur (le tableau ne peut pas être redimensionné) pas le contenu qui peut toujours être altéré.

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 871
    Points : 11 361
    Points
    11 361
    Billets dans le blog
    6
    Par défaut
    Pour traiter les données j'ai essayé unbyte:=Profile.Data^[0]; pour aller récupérer le x ième byte du tableau, ou unbyte:=Profile.Data[x]
    S'il ne s'agit que de lire les octets un par un, au lieu d'accéder au tableau, autant faire un accesseur public en lecture seule au x-ième octet du tableau.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement en retraite
    Inscrit en
    Juin 2002
    Messages
    410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement en retraite
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2002
    Messages : 410
    Points : 307
    Points
    307
    Par défaut
    Merci Andnotor pour les explications. J'avais bien vu qu'il fallait transtyper mon pointeur, mais je ne savais pas comment le faire pour un tableau dynamique.

    Tourlourou, bonne idée, je crois que je vais la mettre en pratique.

    Merci à vous.

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    petit info au passage, en ajoutant {$POINTERMATH ON} dans le source il est possible d'accéder aux pointeurs typés comme si c'était des tableaux. C'est historiquement possible sur le PChar (ou PAnsiChar); avec cette directive de compilation, c'est possible avec tous les types PByte, PCardinal, PMonRecord...c'est très pratique quand on reprend un source C puisque le C ne fait pas de différence entre tableaux et pointeurs...char* et char[] c'est la même chose.

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

Discussions similaires

  1. Problème avec les pointeurs intelligents de boost.
    Par Le Barde dans le forum Boost
    Réponses: 2
    Dernier message: 05/09/2007, 12h47
  2. Petit problème avec les pointeurs et variable
    Par mitherkiller dans le forum C
    Réponses: 5
    Dernier message: 09/03/2007, 22h05
  3. problème avec les pointeurs en c
    Par dialloma dans le forum C
    Réponses: 14
    Dernier message: 01/01/2007, 21h22
  4. probléme avec les pointeurs
    Par killer_instinct dans le forum C++
    Réponses: 6
    Dernier message: 11/12/2006, 11h37
  5. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31

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