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 PAnsiChar, PChar, PWideChar.


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Ukraine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 162
    Points : 163
    Points
    163
    Par défaut Problème avec les PAnsiChar, PChar, PWideChar.
    Bonjour,
    Voilà un code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var id : PAnsiChar;
    begin
       Get(PChar(ID));
       IDEdit.Text:=id;
    end;
    Je fais ainsi, le résultat est bon, mais j'obtiiens une erreur dans le module "ntdll".

    Remarque : Get prendre comme paramètre une variable de type PWideChar, et il faut que j'obtienne ce qu'elle renvoie dans une variable puis je l'envoie dans un string (pour le TEdit).

    Une proposition ?!

  2. #2
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    C'est un peu flou ce que tu demandes ... Get c'est une fonction qui prends en argumet un PWideChar, ok ... Donc, tu n'as qu'a lui donner en parametre l'adresse d'une variable de type WideString ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var Myvar : WideString;
     
    Get(@MyVar[1]);
    Edit1.text:=MyVar;
    Je sais pas si ca va marcher ...

    Bonne chance !

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Ukraine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 162
    Points : 163
    Points
    163
    Par défaut
    La solution proposée ne marche pas ! J'ai toujours une erreur "ntdll.dll".
    Vous avez bien compris le problème, la fonction Get (qui renvoie un boolean) prend en paramètre un PWideChar.

    (PS : le support technique du logiciel me conseille d'utiliser une variable de type PAnsiChar, et moi j'arrive pas à faire le transtypage, j'obtiens toujours une erreur ! : Transtypage incorrect !)

  4. #4
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Est-ce que l'appel de Get suppose que la mémoire du paramètre est bien alouée ? Si oui alors aucun des codes ci-dessus ne fonctionne.

    Essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Var Buffer:Array[0..1000]Of WideChar
    Begin
      Get(@Buffer);
      Edit1.Text:=Buffer;
    C'est brut et pas testé.

  5. #5
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Nono40 Voir le message
    Est-ce que l'appel de Get suppose que la mémoire du paramètre est bien alouée ? Si oui alors aucun des codes ci-dessus ne fonctionne.
    Je dis peut etre une bêtise, mais Delphi ne s'occupe-t-il pas de l'allocation mémoire (pour les types string) ?

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Ukraine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 162
    Points : 163
    Points
    163
    Par défaut
    ce code marche normalement, pas d'erreur ntdll,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Var Buffer:Array[0..1000]Of WideChar
    Begin
      Get(@Buffer);
      Edit1.Text:=Buffer;
    mais la fonction Get retourne des caractères chinois au lieu d'une chaine en bonne et due forme.
    Et comme je l'ai dit, l'équipe technique du logiciel m'a conseillé d'utiliser PAnsiChar en var. Et c'est vrai que ça me retourne une chaine normale, sauf qu'il y a l'erreur de la dll !


  7. #7
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Ben essaye de changer le WideChar en AnsiChar ... Enfin, c'est pas tres logique, si ta fonction prends en argument des WideChar et qu'on lui donne des AnsiChar ...

  8. #8
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    =>djiga4me
    Essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Var Buffer:Array[0..1000]Of AnsiChar
    Begin
      Get(@Buffer);
      Edit1.Text:=Buffer;
    Tu auras peut-être des problème avec les accents et caractères hors plage 32..127.

    Citation Envoyé par mick605 Voir le message
    Je dis peut etre une bêtise, mais Delphi ne s'occupe-t-il pas de l'allocation mémoire (pour les types string) ?
    Oui pour les String AnsiString WideString
    Non pour les PChar PAnsiChar PWideChar

  9. #9
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Nono40 Voir le message
    Oui pour les String AnsiString WideString
    Non pour les PChar PAnsiChar PWideChar
    Alors, est ce que tu sais pourquoi cette solution ne marche pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var Myvar : WideString;
     
    Get(@MyVar[1]);
    Edit1.text:=MyVar;
    Simple curiosité

  10. #10
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Tu perds la notion de type en utilisant l'opérateur @.

    @MaWideString[1] n'est rien d'autre qu'un PWideChar et non pas un WideString.

    La procédure Get n'a pas accès à la référence de la chaine et ne peut donc pas s'occuper de la gestion de mémoire.

  11. #11
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Nono40 Voir le message
    Tu perds la notion de type en utilisant l'opérateur @.

    @MaWideString[1] n'est rien d'autre qu'un PWideChar et non pas un WideString.

    La procédure Get n'a pas accès à la référence de la chaine et ne peut donc pas s'occuper de la gestion de mémoire.
    Ok, merci pour l'info ^^

  12. #12
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Citation Envoyé par mick605 Voir le message
    Alors, est ce que tu sais pourquoi cette solution ne marche pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var Myvar : WideString;
     
    Get(@MyVar[1]);
    Edit1.text:=MyVar;
    Simple curiosité
    ligne a ajouter
    @Nono40
    je pense qu'il faut ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Var Buffer:Array[0..1000]Of AnsiChar
    Begin
      Buffer  :='';
      Get(@Buffer);
      Edit1.Text:=Buffer;

  13. #13
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Citation Envoyé par Montor Voir le message
    ligne a ajouter
    Bien vu ça fonctionne aussi.


    Citation Envoyé par Montor Voir le message
    @Nono40
    je pense qu'il faut ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Var Buffer:Array[0..1000]Of AnsiChar
    Begin
      Buffer  :='';
      Get(@Buffer);
      Edit1.Text:=Buffer;
    Je ne pense pas, Get() doit écrire sans trop se soucier de qu'il y a avant.

  14. #14
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Ukraine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 162
    Points : 163
    Points
    163
    Par défaut
    Cool !
    C'est bon le code ci-dessous à réglé le problème !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var Buffer : array [0..100] of AnsiChar;
    begin
      Buffer:='';
      WLHardwareGetID(@Buffer);
      IDEdit.Text:=Buffer;
    Je vous remercie tous.
    Et si quelqu'un pouvait m'expliquer pourquoi l'initialisation de la variable buffer
    à "" a changé quelque chose !
    (et de passage, je ne comprends pas très bien les notions Char, PChar, AnsiChar, PAnsiChar ...)

  15. #15
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Ca veut dire que la fonction get() tient compte du contenu passé en paramètre avant de répondre et n'initialise pas par défaut.

    Le fait de faire ='' initialise le tableau buffer avec une chaine vide.

  16. #16
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Ukraine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 162
    Points : 163
    Points
    163
    Par défaut
    D'accord !
    Merci pour l'explication !

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

Discussions similaires

  1. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  2. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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