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 :

Petit travail sur un pchar


Sujet :

Langage Delphi

  1. #1
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut Petit travail sur un pchar
    Bonjour,

    Pourriez vous me dire s'il vous plait si je suis dans le vrai ou dans le flou... Et si vous pouviez rectifier merci d'avance...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Button4Click(Sender: TObject);
    var
      P: PChar;
    begin
     P := 'Hello';
    end;
    Est interdit (en tout cas dangereux) car :

    -> On ne connait pas l'espace alloué où pointe P et on risque de faire un debordement de tampon (dangereux)

    Par contre (en sachant que ici Pchar est vide), je peux faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //1 allocation de la zone via GetMemory
      P:= GetMemory(5 * SizeOf(Char));
      //2 Appel de la fonction
      p := 'Hello'; //(5 caractères ....)
    en vous remerciant d'avance... merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    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 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Je ne manipule jamais les PChar par affectation directe, ...
    Alors GetMemory, je ne connaissais pas, lui préférant la procédure GetMem (je préfère passer le paramètre P en var que l'avoir comme résultat de fonction)

    mais ce qui est quasiment sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    P:= GetMemory(5 * SizeOf(Char)); // Alloue 5 Char, donc 4 + 1 pour le Zéro Terminal ...
     
    p := 'Hello'; //(5 caractères ....): // ben tu oublie le précédent p, donc fuite mémoire, tu affecte une zone constante à ce pointeur
    en fait, ça rejoind ma récente connerie : Tableau Dynamique pointant sur Tableau Statiques , ou je fait pointer un pointeur sur une zone constante, bon pour ce que je voulais faire c'est parfait, en utilisant justement un pointeur, mais cela illuste que ton 'Hello' constant ne doit pas être affecté à P si tu veux ensuite le modifier par exemple ...


    Tu as les fonctions StrAlloc et StrDispose mais cela ajoute un octet pour la taille maximale du pointeur, comme pour une AnsiString ...

    montre nous le contexte d'utilisation, et l'on te répondra ...

  3. #3
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 506
    Points : 2 778
    Points
    2 778
    Billets dans le blog
    10
    Par défaut
    Je ne suis pas sur que celà soit nécessaire. Par contre tu peux utiliser le code ci dessous car Delphi gère la réservation de mémoire pour le type string ( qui est par défaut equivalent au type AnsiString).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      st1 : string ;
      p : pchar ;
    begin
      st1 := 'Hello' ;
      p := pchar (st1) ;
    .....

  4. #4
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    Tout d'abord je vous remercie de vos réponses

    En fait l'interet est juste de comprendre un peu "mieux" le fonctionnement des pchar, je ne cherche pas l'utilité mais l'interet plutot pédagogique...

    @Alweber : Bien sûr j'aurai fait ainsi dans la pratique...

    @ShaiLeTroll : En effet c'est ça que je cherche à comprendre, comment écrire le hello dans la zone mémoire définit juste au dessus...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    P:= GetMemory(9 * SizeOf(Char)); // Alloue 5 Char, donc 4 + 1 pour le Zéro Terminal ...
     
    // Comment ecrire le hello dans cet espace ?
    Merci beaucoup pour votre aide

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    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 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Tu peux faire un CopyMemory ... ou char par char ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    P^:= 'H';
    Inc(P);
    P^ := 'e';
    Inc(P);
    P^ := 'l';
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const 
      MaConst = 'Hello';
    ...
      GetMem(P, 9); // Aller un Char, c'est 1 de size, ...
      CopyMemory(P, @MaConst[1], Length(MaConst));
      PChar(Integer(P) + Length(MaConst))^:= #0;

  6. #6
    Membre actif Avatar de remixtech
    Profil pro
    Enseignant
    Inscrit en
    Février 2003
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2003
    Messages : 272
    Points : 214
    Points
    214
    Par défaut
    D'accord je vous remercie pour vos réponses, c'est résolu tout est plus clair !

  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
    Bon euh, je dis ça je dis rien, mais...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      P: PChar;
    begin
      P := 'Hello';
    end;
    ça fonctionne très bien. La chaîne 'Hello' est est un bloc constant en mémoire, qui est bien terminé par un zéro terminal. L'affectation ne recopie rien, il fait pointer P sur cette zone constante.
    Par contre : ne pas modifier ce qui est pointé par P après ! Puisque c'est une zone de mémoire constante.

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    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 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    P:= GetMemory(5 * SizeOf(Char)); // Alloue 5 Char, donc 4 + 1 pour le Zéro Terminal ...
     
    p := 'Hello'; //(5 caractères ....): // ben tu oublie le précédent p, donc fuite mémoire, tu affecte une zone constante à ce pointeur
    ... ton 'Hello' constant ne doit pas être affecté à P si tu veux ensuite le modifier par exemple ...

    Merci de confirmer ce que j'ai dit, SJRD ... mais en plus clair !

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    En fait l'interet est juste de comprendre un peu "mieux" le fonctionnement des pchar, je ne cherche pas l'utilité mais l'interet plutot pédagogique...
    Cf : http://reisubar.developpez.com/tutor...trings-pchars/

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/07/2007, 12h03
  2. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49
  3. Travailler sur des données qui doivent être triées
    Par haypo dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 19/07/2003, 17h13

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