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 :

Pchar , string .. déclaration..


Sujet :

Langage Delphi

  1. #1
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    748
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 748
    Points : 500
    Points
    500
    Par défaut Pchar , string .. déclaration..
    Bonjours je poste ceci pour avoir des informations ...

    j'ai deux code presque identique , un marche pas l'autre , et je voudrais savoir pourquoi .

    1er code qui marche pas
    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
     
    procedure toto(calcul:string;var resultat:string);
    begin
          bla bla bla ..
          resultat:=calcule(calcul) ;    
          bla bla bla ..
    end;
     
    Procedure EnvoieResultat;
    var resultat:string
    begin
          Bla Bla Bla..
          toto('1+1',resultat);
          Presultat:=Pchar(resultat);
    end;
    2eme code qui marche
    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
     
    var resultat:string
    ...
    procedure toto(calcul:string);
    begin
          bla bla bla ..
          resultat :=calcule(calcul) ;    
          bla bla bla ..
    end;
     
    Procedure EnvoieResultat;
    begin
          Bla Bla Bla..
          toto('1+1');
          Presultat:=Pchar(resultat);
    end;
    entre les deux code la seule difference est la variable resultat qui est soit passé en parametre de retour , soit en globale.

    quand je la passe en globale mon code marche , et pas quand elle est en parametre , et mes erreurs sont au niveau du transtypage String=>pchar
    il aurait il une difference entre les deux declaration ?
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    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 862
    Points : 11 321
    Points
    11 321
    Billets dans le blog
    6
    Par défaut
    dans le 1° exemple, ta chaîne est locale à la procédure : quand tu en sors, Presultat doit pointer sur une zone désallouée, j'imagine

    nb : tu as des impératifs pour utiliser des procédures, ou c'est juste que tu n'aimes pas les fonctions ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    748
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 748
    Points : 500
    Points
    500
    Par défaut
    Salut ,

    tourlourou l'utilisation des procedures est plutot une habitude , mais j'utilise aussi les functions lolol

    par contre je ne suis pas d'accord avec toi pour ton explication , certe la variable est locale , mais initialisé par l'appel de la procedure "toto" avant d'etre envoyé dans la variable Presultat , donc la portance est ok.

    par contre je crois que le transtypage de String en Pchar ou Pchar en String , ne marche que sur des chaines longues ( AnsiString ou WideString )

    Je crois que par defaut les variable globales declarées en string sont declaré comme des AnsiString.
    tutu : string <= variable globale ( AnsiString )

    Par contre quand on passe une chaine en parametre je pense que l'on passe systemement un string declarées comme shortstring

    procedure toto ( var tutu : string ); <= ( shortString ).

    Mais j'en suis pas sur !
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 501
    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 501
    Points : 2 768
    Points
    2 768
    Billets dans le blog
    10
    Par défaut
    J'ai testé ton code sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure toto (calcul:string; var resultat:string);
    begin
      resultat:=calcul + 'A'  ;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var resultat : string ;
    begin
      toto('1+1',resultat);
      Label1.caption :=Pchar(resultat);
    end;
    Il marche parfaitement. Donc tu situe mal le problème. Peux tu être plus explicite sur la procedure qui utilise le résultat ?

  5. #5
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    748
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 748
    Points : 500
    Points
    500
    Par défaut
    salut ,
    oui je suis d'accord avec toi , ce que tu as ecris marche parfaitement
    ma routine marche parfaitement dans ce cas aussi .
    si je reprends ta routine et ajoute la ligne en gras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure toto (calcul:string; var resultat:string);
    begin
      resultat:=calcul + 'A'  ;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var resultat : string ;
    begin
      toto('1+1',resultat);
      Label1.caption :=Pchar(resultat);
    Presultat:=Pchar(resultat) ;
    end;
    explication :
    la routine se trouve dans une DLL ( d'ou son passage en Pchar ).
    La variable Presultat est le retour de la fonction qui se trouve dans la Dll.

    - si je declare la variable resultat en global mon application reçois bien le resultat .
    - si je declare la variable resultat en parametre de procedure mon application reçois le resultat erronée.

    je pense que çà viens bien du transtypage car si la valeur de mon resultat est > 2 je recois des valeur tronqué ( je pense que le tronc correspont a ce qui devrai etre le 0 terminal du Pchar )

    bye
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Lorsque la variable "résultat" est déclarée en interne de la procédure, l'allocation mémoire est libéré. Donc, dans ce cas, le PChar pointe sur une zone mémoire potentiellement modifiée (ce qui ne se produit pas pour la variable globale dont les caractères restent alloués).
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  7. #7
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    748
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 748
    Points : 500
    Points
    500
    Par défaut
    salut ,

    Merci pour l'info Graffito ! j'avais pas du tout pensé a cela ! et qui semble explique le probleme !

    bye
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    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 862
    Points : 11 321
    Points
    11 321
    Billets dans le blog
    6
    Par défaut
    dans le 1° exemple, ta chaîne est locale à la procédure : quand tu en sors, Presultat doit pointer sur une zone désallouée, j'imagine
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 501
    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 501
    Points : 2 768
    Points
    2 768
    Billets dans le blog
    10
    Par défaut
    En fait tout celà ne se passe pas réellement comme celà. Car le système décide de ce qu'il va faire et en réalité le premier caractère d'une chaîne AnsiString est précédé de huit octets. Je cite le document officiel borland :
    Une variable chaîne longue occupe quatre octets de mémoire, qui contiennent un pointeur sur une chaîne allouée
    dynamiquement. Lorsqu'une variable chaîne longue est vide (contient une chaîne d'une longueur de zéro), le
    pointeur de chaîne est nil et aucune mémoire dynamique n'est associée avec la variable chaîne. Pour une valeur
    de chaîne non vide, le pointeur de chaîne pointe sur un bloc de mémoire alloué dynamiquement contenant la valeur
    chaîne en plus d'un indicateur de longueur 32 bits et d'un compteur de références 32 bits. Le tableau suivant montre
    le contenu d'un bloc mémoire de chaîne longue.
    Disposition en mémoire dynamique d'une chaîne longue (Win32 seulement)
    Décalage Contenu
    -8 Compteur de références sur 32 bits
    -4 Longueur en octets
    0..Longueur - 1 Chaîne de caractères
    Longueur Caractère NULL
    Le caractère NULL situé à la fin d'un bloc mémoire de chaîne longue est automatiquement maintenu par le
    compilateur et par les routines intégrées de gestion de chaîne. Cela permet de transtyper directement une chaîne
    longue en chaîne à zéro terminal.
    Le compilateur génère un bloc mémoire de même implantation qu'une chaîne allouée dynamiquement pour des
    constantes et littéraux chaînes, mais avec un compteur de références de -1. Lorsqu'une variable chaîne longue est
    affectée à une constante chaîne, le pointeur de chaîne se voit affecter l'adresse du bloc mémoire généré pour la
    constante chaîne. Les routines intégrées de gestion de chaîne savent qu'elles ne doivent pas essayer de modifier
    des blocs ayant un compteur de références de -1.
    D'autre part suivant les procédures externes appelées le compilateur peut générer un code différement. Si tu le souhaites, j'ai fait un petit programme qui permet de voir ce comportement que je peut mettre tout à l'heure en ligne.

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

Discussions similaires

  1. PChar, string, & Co
    Par juvamine dans le forum Langage
    Réponses: 9
    Dernier message: 02/07/2009, 16h00
  2. Thread ShellExecute PChar string transtypage
    Par ouiouioui dans le forum Débuter
    Réponses: 11
    Dernier message: 02/11/2008, 00h51
  3. [String] Déclaration de constantes
    Par bulbo dans le forum Langage
    Réponses: 10
    Dernier message: 22/07/2008, 17h19
  4. [Raccourci]-Pchar ,String
    Par aityahia dans le forum Delphi
    Réponses: 3
    Dernier message: 14/05/2006, 16h21
  5. DLL : récupérer des string/PChar...
    Par the_magik_mushroom dans le forum Langage
    Réponses: 8
    Dernier message: 10/11/2005, 10h58

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