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 :

[Syntaxe] Pointeur sur enregistrement : syntaxe exacte


Sujet :

Langage Delphi

  1. #1
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut [Syntaxe] Pointeur sur enregistrement : syntaxe exacte
    Bonjour

    Si j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    type
      PData : ^TData;
      TData = record
        Name : String;
      end;
     
    var
      PtrData : PData;
    Que j'écrive PtrData.Name ou PtrData^.Name ça fonctionne .

    Par contre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with PtrData do
    begin
      Name ... // Erreur !!!
    end;
     
     
    with PtrData^ do
    begin
      Name ... // Ok
    end;

    Quelle est la syntaxe exacte ?

    @+
    Php

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Il n'est pas logique que fonctionne.

  3. #3
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    Oui nous sommes d'accord c'est bizarre ...

    On dirait que Delphi 7 déréférence automatiquement le pointeur, comme s'il s'agissait d'un objet.

    Dans le doute je crois que je vais mettre "^."

  4. #4
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 959
    Points
    959
    Par défaut
    la syntaxe exacte est celle utilisant l'opérateur d'indirection ^ .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    PtrData^.Name := ...

  5. #5
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 959
    Points
    959
    Par défaut
    Citation Envoyé par phplive
    Oui nous sommes d'accord c'est bizarre ...

    On dirait que Delphi 7 déréférence automatiquement le pointeur, comme s'il s'agissait d'un objet.

    Dans le doute je crois que je vais mettre "^."
    Non D7 ne déréferencie rien automatiquement, ca fonctionne par chance à cause de la représentation en mémoire des String. (si c'était des shortstring ca n'aurais pas marcher, de meme pour les autre type ordinaux).

  6. #6
    Membre habitué Avatar de phplive
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 179
    Points : 150
    Points
    150
    Par défaut
    A merci, je crois que j'ai failli faire une c... (j'ai quelques lignes de code à revoir )

    @+
    Php

  7. #7
    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
    Je me permets de vous détromper...

    La syntaxe pure est bien celle avec ^.
    Toutefois, l'autre est tout à fait acceptée, correcte, propre, et tout ce que vous voulez.
    C'est parce que Borland est depuis longtemps assez intelligent pour concevoir des compilateurs qui comprennent bien qu'un pointeur suivit d'un point implique forcément que l'on accède à ce que le pointeur pointe

    En fait cette syntaxe avec le . seul est même conseillée. Elle est plus claire

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Je ne connaissais pas cette possibilité mais elle apporte, sous Win32, une ambiguité : on ne sais plus ( contexte de revue de code) s'il s'agit d'une variable allouée sur le Heap ou sur la pile. A mon avis il y a un risque potentiel concernant la désallocation de ressources.
    Pensez à la maintenance

  9. #9
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 959
    Points
    959
    Par défaut
    Bien vu SJRD. En fait dans le cas des enregistrement (record) delphi rajoute automatiquement le "^".
    D'ailleur on le voit clairement dans le code ASM généré par Delphi, j'ai tenté le coup avec un enregistrement simple :

    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
     
    type
      PData = ^TData;
      TData = record
        Name : String;
        Age : integer;
      end;
     
    var
      PtrData : PData;
    ...
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      New(ptrData);
      ptrData^.Age := 255;
      ptrData.Age  := 255;
      caption := IntToStr(ptrData.Age);
    end;
    Et surprise admirez le code ASM généré par le compilo de Delphi

    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
     
    Unit1.pas.40 New(ptrData);
    004532F3 8B15C0324500     mov edx,[$004532c0]
    004532F9 B808000000       mov eax,$00000008
    004532FE E8491DFBFF       call @New
    00453303 A31C6C4500       mov [PtrData],eax
     
    Unit1.pas.42: ptrData^.Age := 255;
    00453308 A11C6C4500       mov eax,[PtrData]
    0045330D C74004FF000000   mov [eax+$04],$000000ff
     
    Unit1.pas.42: ptrData.Age := 255;
    00453314 A11C6C4500       mov eax,[PtrData]
    00453319 BEFF000000       mov esi,$000000ff
    0045331E 897004           mov [eax+$04],esi
    On voit clairement que Delphi génère absolument le meme code pour les deux affectation (Je voudrais pas rentrer dans les détails d'utilisation de ESI ... les Assemblistes comprendront ) Sinon dans les deux cas on récupère bien le contenu de la zone pointée par PtrData (le +$04 est le déplacement dû à la variable membre "Name" de notre record qui est du type String (pointeur sur 4 octet) )

    Mais personnellement je pense qu'il faut se garder d'utiliser de pareilles methodes de prog, parce que ce qui a toujours maintenu le code pascal propre (par rapport aux langages comme C) est son fort typage, donc il vaudrait mieux rester discipliné dans l'écriture du code meme si le compilo devient de plus en plus tolérant, de plus que va t-il se passer si l'on a un record qui lui meme va contenir des membre qui sont pointeur sur d'autres record (comme c le cas ppour les listes simplement et doublement chainées) ....

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/03/2015, 17h55
  2. Réponses: 5
    Dernier message: 13/07/2011, 19h56
  3. TADOCommand + Pointeur sur l'enregistrement + affichage
    Par kurkaine dans le forum C++Builder
    Réponses: 3
    Dernier message: 18/11/2005, 17h15
  4. Explications sur la syntaxe iptables
    Par Nightfall dans le forum Sécurité
    Réponses: 4
    Dernier message: 11/05/2005, 02h33
  5. explication syntaxe requete sur pgsql
    Par alain.lc dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/12/2004, 11h24

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