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 :

StrCopy() : pourquoi cette syntaxe fait planter ?


Sujet :

Langage Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Points : 123
    Points
    123
    Par défaut StrCopy() : pourquoi cette syntaxe fait planter ?
    Bonsoir à tous.

    Je croyais avoir fait ça X fois, mais là, ça plante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StrCopy( PChar(Nom_F), PChar( @Tab_Nom_F[0])   );
    Nom_F est un string, et Tab_Nom_F un tableau de char.

    Plantage. Msg d'erreur : violation d'accès bla bla bla...

    Merci pour toute aide.

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    je ne sais pas dans quel langage tu es, mais en C par exemple il faut vérifier es choses suivante avant de faire une copie de string:

    la string d'arrivée doit être alloué et avoir une taille suffisante pour acceuillir le donées contenue dans la string de départ.

    ensuite est tu certain que ton tableau contiens bien une donnée et que cela ne pointe pas sur quelque chose qui n'existe pas.

    Apres tu as des appel imbriqué, peu etre que c'est PChar qui plante ou qui ne retourne pas ce qu'il faut.

    voila les quelques pistes que je vois.

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    d'claration de Tab_Nom_F c'est quoi??

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Points : 123
    Points
    123
    Par défaut
    Citation Envoyé par edam Voir le message
    d'claration de Tab_Nom_F c'est quoi??
    Tab_Nom_F est un tableau de char : Tab_Nom_F : array[0..160] of char;

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Points : 123
    Points
    123
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    je ne sais pas dans quel langage tu es, mais en C par exemple il faut vérifier es choses suivante avant de faire une copie de string:

    la string d'arrivée doit être alloué et avoir une taille suffisante pour acceuillir le donées contenue dans la string de départ.

    ensuite est tu certain que ton tableau contiens bien une donnée et que cela ne pointe pas sur quelque chose qui n'existe pas.

    Apres tu as des appel imbriqué, peu etre que c'est PChar qui plante ou qui ne retourne pas ce qu'il faut.

    voila les quelques pistes que je vois.
    Langage : Delphi 7.

    "(...) la string d'arrivée doit être alloué et avoir une taille suffisante (...)"

    Oui : Tab_Nom_F ne contient que 160 char (161 en partant de 0) alors qu'un string comme Nom_F en contient 255, ou je me trompe ?

    Le tableau contient bien les données : je les vois ds le débogueur. Les pointeurs pointent effectivement sur les sources et destination.

    Et la string est allouée (en Delphi) puisque déclarée comme variable et non comme un type.

  6. #6
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    [QUOT
    et si tu met juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    StrCopy( PChar(Nom_F), PChar( Tab_Nom_F) );

  7. #7
    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 : 55
    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 457
    Points
    28 457
    Par défaut
    Citation Envoyé par bvsud Voir le message
    Langage : Delphi 7.

    "(...) la string d'arrivée doit être alloué et avoir une taille suffisante (...)"

    Oui : Tab_Nom_F ne contient que 160 char (161 en partant de 0) alors qu'un string comme Nom_F en contient 255, ou je me trompe ?

    Le tableau contient bien les données : je les vois ds le débogueur. Les pointeurs pointent effectivement sur les sources et destination.

    Et la string est allouée (en Delphi) puisque déclarée comme variable et non comme un type.
    alors depuis Delphi 2...ça remonte le type string est par défaut un "long" string, soit un pointeur alloué dynamiquement l'ancien type string de 255 caractères hérité du Pascal (et de Delphi 1) est devenu le ShortString

    Donc si ton code veux placer dans un string la valeur d'un array of char...ben tu fais juste un ":="

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.FormCreate(Sender: TObject);
    const
      test : array[0..5] of char = 'TOTO'#0;
    var
      str  : string;
    begin
      str := test;
      ShowMessage(str);
    end;

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Points : 123
    Points
    123
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    [QUOT
    et si tu met juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    StrCopy( PChar(Nom_F), PChar( Tab_Nom_F) );
    Même plantage. J'avais déjà testé :




    Il y a donc bien un pb...

    Je vais réécrire la fonction, en m'y prenant différemment.

  9. #9
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    Paul TOTH t'a donnée la solution sans passé par strcopy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Function  MyStrCoy(const Source: PChar): string;
    begin
      result := source; // bien sûr en s'assurant que source contine char #0  
    end;
    pour strcopy dans l'aide de delphi:
    Copie Source vers Dest et renvoie Dest.

    Unité SysUtils

    Catégorie: routines de gestion des chaînes (à zéro terminal)
    function StrCopy(Dest: PChar; const Source: PChar): PChar;

    Description
    Utilisez StrCopy pour copier une chaîne terminée par le caractère Null. StrCopy n'effectue aucune vérification de taille. Le tampon de destination doit pouvoir stocker au moins StrLen(Source)+1 caractères.

    Pour disposer de la vérification de taille, utilisez la fonction StrLCopy.

  10. #10
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Points : 123
    Points
    123
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    alors depuis Delphi 2...ça remonte le type string est par défaut un "long" string, soit un pointeur alloué dynamiquement l'ancien type string de 255 caractères hérité du Pascal (et de Delphi 1) est devenu le ShortString

    Donc si ton code veux placer dans un string la valeur d'un array of char...ben tu fais juste un ":="

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.FormCreate(Sender: TObject);
    const
      test : array[0..5] of char = 'TOTO'#0;
    var
      str  : string;
    begin
      str := test;
      ShowMessage(str);
    end;
    Merci à Paul Toth et aux autres aussi

    Syntaxe fonctionnant:
    // Lst_F : TStringList
    // Nom_F_Examine : string;

    Lst_F.Add(Tab_Nom_F_Examine);
    Nom_F_Examine := Nom_Court_Lect_Base + Lst_F[Num_F_Pointe]; // Formatage du Nom_F
    Lst_F.Clear; // vidange de la liste

    Effectivement : Nom_F := Tab_Nom_F; passe sans pb

    J'ai eu recours à la liste Lst_F pour un formatage plus simple de la chaîne complète, mais ça n'a rien à voir.

    Bizarre...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/03/2005, 13h00
  2. [BCB5][FB1.5]Pourquoi cette commande ne fonctionne pas ?
    Par Sitting Bull dans le forum Débuter
    Réponses: 1
    Dernier message: 17/11/2004, 16h27
  3. probleme de requette qui fait planter powergres
    Par fehmitn dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 15/09/2004, 18h48
  4. Réponses: 12
    Dernier message: 16/03/2004, 14h21
  5. fonction qui en fait planter une autre
    Par ickis dans le forum C
    Réponses: 5
    Dernier message: 18/08/2003, 21h33

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