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

Delphi Discussion :

Copy String to array of char


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 317
    Points : 88
    Points
    88
    Par défaut Copy String to array of char
    Bonsoir,
    J'aurais une petite question de compréhension,
    pourquoi je peux faire ceci et le sens inverse ne fonctionne pas..
    example.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var
    Buf1 :array[1..120] of char;
    Buf2 :array[1..120] of char;
    TempStr : String;
    ..
    // Buf1 -> remplie de données, ok
    ..
    TempStr := Buf1; // ceci fonctionne
    Buf2:= TempStr; // ceci ne fonctionne pas
    ..
    ..
    Merci beaucoup pour une petite explication et comment dois-je faire.
    Salutations

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Points : 311
    Points
    311
    Par défaut
    En fait, qu'on m'arrête si je dis des bêtises,
    Quand on déclare une variable de type string, on déclare un pointeur de chaine.

    Ton tableau étant une chaine de caractères peut donc être affecté à la chaine string tandis que l'inverse n'est pas vrai, ton tableau ne peut référencer un pointeur.

    Tu aurais pu également déclarer ta chaine de la façon suivante string[120] (chaine courte) et affecter directement ton tableau. Seul petit problème c'est que pour les chaines courtes le premier caractère de ta chaine est réservé pour connaitre la taille de ta chaine. pour que ton code puisse marcher il aurait fallu déclarer ton tableau comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var
    Buf1 :array[0..120] of char;
    Buf2 :array[0..120] of char;
    TempStr : String[120];
    Mais pour que cela ne pose pas de problème il faut que tu renseignes dans l'élément de ton tableau à l'indice 0 la longueur de ta chaine.

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour

    Copie caractère par caractère => for i:= 1 to length(TempStr) do Buf2[i]:= TempStr[i];

    Exemple [D7]: sur une fiche 1 Tbouton 2 Tedit
    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 TForm1.Button1Click(Sender: TObject);
      KMAX = 8; // 8 pour l'exemple
    var
      Buf1,Buf2 : array[1..KMAX] of char;
      TempStr   : String[KMAX];
      i         : integer;
    begin
      TempStr := '';
      for i:= 1 to KMAX do buf1[i]:=inttostr(i)[1];
      TempStr := Buf1; // ceci fonctionne
      edit1.Text := tempstr;
      tempstr := '87654321'; // ... traitement
      for i:= 1 to length(TempStr) do Buf2[i]:= TempStr[i];// ceci fonctionne
      edit2.Text := Buf2;
    end;
    Comme tu commences à 1 avec buf tout va bien.
    Attention au résidu en fin de buf2 si TempStr est plus petit que buf2.

    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  4. #4
    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
    Tu peux optimiser grave avec Move :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Move(Str[1], Buf, Length(Str));
    Mais je suppose que ton buffer est AZT (à zéro terminal) non ?
    Dans ce cas tu ajoute 1 au Move :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Move(Str[1], Buf, Length(Str)+1);
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 317
    Points : 88
    Points
    88
    Par défaut
    Hallo, de faire une copie caractère par caractère
    Copie caractère par caractère => for i:= 1 to length(TempStr) do Buf2[i]:= TempStr[i];
    n'est-ce pas assez lourd seulement pour copier un array dans un String?

    Le but de mon problèm est que je n'arraivais pas a faire ceci!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Buf2 := copy(Buf1, 1, 18);
    Donc j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     TempStr := copy(Buf1, 1, 18);
     Buf2 := TempStr // qui ne fonctionne pas
    Donc si je veux résoudre ce problèm je dois passez par une boucle ou de définir le string[120]!

    Merci pour la réponse. Salutations.

  6. #6
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Comme indiqué par macumba en deuxième réponse, je teconseille de commencer tes tableaux avec un indice de 0, pas de 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Buf0,Buf1 :array[0..120] of char;
    Bidouilleuse Delphi

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 317
    Points : 88
    Points
    88
    Par défaut
    Je viens de faire ce que vous m'avez dit:
    En définisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var
    Buf1 :array[0..120] of char;
    Buf2 :array[0..120] of char;
    TempStr : String[120];
    Mais le compilateur ne pass pas à cette ligne
    Types incompatibles : 'Array' et 'ShortString'

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Zut, dans l'exemple le KMAX est défini en constante mais je pense que tu avais corrigé.(oubli dans copier/coller)Pour ma part la boucle fonctionne.
    La définition du string[120] c'est pour que l'ensemble soit homogène.

    Mais il existe peut-être d'autre solutions.
    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Ton message est passé pendant que j'écrivais.
    Pour répondre ,c'est normal Buf1 est un tableau, TempStr une chaine de caractère.
    Le fait de définir TempStr : String[120]; lui indique simplement que c'est une chaine de caractère qui aura 120 de long maxi. Pas un tableau.
    Fait la boucle for ou attend de voir d'autre réponses.

    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  10. #10
    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
    Citation Envoyé par Ardely
    Le but de mon problèm est que je n'arraivais pas a faire ceci!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Buf2 := copy(Buf1, 1, 18);
    Donc j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TempStr := copy(Buf1, 1, 18);
    Buf2 := TempStr // qui ne fonctionne pas
    Au lieu de t'en tenir à ta première (bonne) idée : avec juste un changement : utiliser Move au lieu de Copy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Move(Buf1[1], Buf2[1], 18);
    Avec les Buf de 1 à 120
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  11. #11
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 317
    Points : 88
    Points
    88
    Par défaut
    Hallo,
    Tu as raison avec Move sa fonctionne absolument correctement bien.
    Merci à tous pour les solutions.. qui m'a fait mieux comprendre à mieux adapter les possibilité pour les array et string.

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Points : 311
    Points
    311
    Par défaut
    Mais le compilateur ne pass pas à cette ligne
    Types incompatibles : 'Array' et 'ShortString'

    Code :

    Buf1 := TempStr;
    Curieux chez moi ca ne pose pas de pb. Tu n'aurais pas bouger certaines directives de compilation? Tu es en quelle version de Delphi?
    Enfin c'est pas bien grave c'est pas une méthode très recommandée.

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 12/06/2007, 14h28
  2. Spliter un string en array of char ?
    Par MaTHieU_ dans le forum Delphi
    Réponses: 5
    Dernier message: 18/03/2007, 22h11
  3. Champ String et Constante Array of Char ?
    Par BXDSPORT dans le forum Delphi
    Réponses: 4
    Dernier message: 24/08/2006, 12h35
  4. TFileStream et Array of char
    Par busy999 dans le forum Langage
    Réponses: 2
    Dernier message: 06/07/2004, 21h00
  5. Réponses: 6
    Dernier message: 24/07/2003, 12h39

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