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

Free Pascal Discussion :

Suppression des espaces dans une chaîne


Sujet :

Free Pascal

  1. #21
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    Le programme marche , c'est un vrai cours particulier que j'ai eu là je te remercie , j'ai appris pleins de trucs .
    Je persiste à penser que ta méthode était la plus complexe ( dis moi si je me trompe ) , car je n'ai pas encore vu des fonctions de type setlength...

    PS : la prochaine fois quand je mettrai un algo dis le tt de suite si il est incomplet on ira bcp plus vite .

  2. #22
    Membre confirmé Avatar de Haywire
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 462
    Points : 573
    Points
    573
    Par défaut
    A ma connaissance il n'y a pas de moyen plus simple de supprimer les espaces dans une chaine de caractères.
    De nombreuses procédures et fonctions sont déjà fournies par le langage, mais il n'en existe pas qui supprime les espaces dans une chaine. La seule qui s'en rapproche c'est la fonction trim, qui enlève les espaces se trouvant au début et à la fin d'une chaine.

    Attention setLength n'est pas une fonction, c'est une procédure, elle ne renvoit pas de résultat.

    La plupart des exercices de débutants (et c'est vrai dans tous les langages) consistent à réécrire les fonctions et procédures fournies par le langage, pour comprendre comment elles fonctionnent.

    Une autre méthode aurait été de déclarer une variable local de type chaine dans la fonction, de copier un à un chaque caractère de la 1ere chaine dans la 2e, sauf les espaces. Et de renvoyer la 2e chaine comme résultat de la fonction. Mais ça aurait utilisé + de mémoire puisque le programme devrait gerer 2 chaines en même temps.
    Développeur écolo, je suis pour le développement durable.

  3. #23
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour,
    Citation Envoyé par Mushroom7
    Une autre méthode aurait été de déclarer une variable local de type chaine dans la fonction, de copier un à un chaque caractère de la 1ere chaine dans la 2e, sauf les espaces. Et de renvoyer la 2e chaine comme résultat de la fonction. Mais ça aurait utilisé + de mémoire puisque le programme devrait gerer 2 chaines en même temps.
    Pas besoin de deux chaînes, tu peux appliquer ce principe à la chaîne elle-même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function Reply (s : String) : String;
    Var CompteurSource, CompteurDest : Byte;
    Begin
      CompteurDest := 1;
      for CompteurSource := 1 to Length(s) do
        if s[CompteurSource] <> ' '
           then
             begin
               s[CompteurDest] := s[CompteurSource];
               Inc(CompteurDest);
             end;
      s[0] := Char(CompteurDest);
      Reply := s;
    End;
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  4. #24
    Membre confirmé Avatar de Haywire
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 462
    Points : 573
    Points
    573
    Par défaut
    Pas mal du tout. Sauf que s[0] := Char(CompteurDest) déclenche une erreur: [Error] Project2.dpr(31): Element 0 inaccessible - use 'Length' or 'SetLength'

    Donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function Reply (s : String) : String;
    Var CompteurSource, CompteurDest : Byte;
    Begin
      CompteurDest := 1;
      for CompteurSource := 1 to Length(s) do
        if s[CompteurSource] <> ' '
           then
             begin
               s[CompteurDest] := s[CompteurSource];
               Inc(CompteurDest);
             end;
      setLength(s,CompteurDest-1);
      Reply := s;
    End;
    Développeur écolo, je suis pour le développement durable.

  5. #25
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Mushroom7
    Sauf que s[0] := Char(CompteurDest) déclenche une erreur: [Error] Project2.dpr(31): Element 0 inaccessible - use 'Length' or 'SetLength'
    A mon avis, ton compilateur considère qu'il s'agit d'ansistrings.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  6. #26
    Membre confirmé Avatar de Haywire
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 462
    Points : 573
    Points
    573
    Par défaut
    Je suis sous Delphi donc string = ansiString chez moi.
    Mais je ne pense pas que ça ait un rapport avec le format, ça doit être une simple protection, qui n'existe peut-être que sous delphi.
    Développeur écolo, je suis pour le développement durable.

  7. #27
    Membre actif Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Points : 261
    Points
    261
    Par défaut
    Bonjour,
    Sous TurboPascal et FreePascal, s[0] = Length(s)
    Si tu change S[0] c'est comme si tu veux faire SetLength(s) mais de maniere plus exotique...
    L'erreure vient probablement de la.

  8. #28
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    J'ai créé la fonction suivante sous Pascal Delphi qui possède la fonction Delete dans l'unité System.
    Function OteBlanc(MonString:String):String;
    Begin
    MonString:=Trim(MonString);
    While (Pos(' ',MonString)>1)and(Pos(' ',MonString)<Length(MonString)) do
    delete(MonString,Pos(' ',MonString),1);
    Result:=MonString;
    end;

  9. #29
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hi,
    Citation Envoyé par Mushroom7
    Je suis sous Delphi donc string = ansiString chez moi.
    Mais je ne pense pas que ça ait un rapport avec le format, ça doit être une simple protection, qui n'existe peut-être que sous delphi.
    En Delphi, string est une ansiString, qui peut prendre une longueur > 255, on ne peut donc pas stocker cette longueur dans chaine[0] qui est un char, et ne peut donc valoir plus de 255.
    La procedure SetLength existe, il faut s'en servir.

    Citation Envoyé par defluc
    J'ai créé la fonction suivante sous Pascal Delphi qui possède la fonction Delete dans l'unité System.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function OteBlanc(MonString:String):String;
    Begin
      MonString:=Trim(MonString);
      While (Pos(' ',MonString)>1)and(Pos(' ',MonString)<Length(MonString)) do
      delete(MonString,Pos(' ',MonString),1);
      Result:=MonString;
    end;
    ça marche plus ou moins, mais pas pour tous les cas, et présente l'inconvénient de partiellement parcourir la chaine plusieurs fois, via la fonction Pos (3 fois (voir plus loin) par espace tant qu'il en reste dans la chaine, sauf ceux de début/fin supprimés par trim [qui elle-même a déjà parcouru la chaine]), et le test contrôlant la boucle while n'est pas bon : la partie que j'ai mise en rouge ne sert à rien, Pos ne pouvant en aucun cas renvoyer une valeur > à la longueur de la chaine (renvoie 0 si caractère pas trouvé).
    Et de plus, l'autre test contrôlant la boucle while est faux:
    que se passe-t-il s'il ne reste qu'un caractère dans la chaine, et qu'il s'agit d'un espace ? il ne sera pas supprimé.

    donc le test devrait être
    Pourquoi 3 fois par espace ? une fois par couleur ci-dessous:
    While (Pos(' ',MonString)>1)and(Pos(' ',MonString)<Length(MonString))[/color] do
    delete(MonString,Pos(' ',MonString),1);
    dont, comme précisé plus haut, une inutile Pos(' ',MonString)

    A mon avis, la meilleure version est celle de Mushroom7 , corrigeant celle d'Alcatîz, en utilisant SetLength, et en ayant vu que la longueur finale est = CompteurDest-1.

    Dailleurs, pour éviter ce CompteurDest-1 à la fin, j'aurais initialisé CompteurDest à 0, et l'aurais incrémenté avant d'ajouter le caractère <> ' ' qui vient d'être trouvé dans la boucle, ce qui fait que CompteurDest aurait toujours valu la longueur effective de la chaine en reconstruction. Mais c'est bien pour pinailler.
    Si les cons volaient, il ferait nuit à midi.

  10. #30
    Membre actif Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Points : 261
    Points
    261
    Par défaut
    Bonjour,

    Je propose ce code ci, il me semble qu’il n’est pas très compliqué et fait bien son boulot.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function noSpaces( s : STRING ) : STRING;
    var  i : BYTE;
         saux : STRING;
    Begin
      saux:= '';
      for i:= 1 to length(s) do
        if not( s[i] = ' ') then saux:= saux+s[i];
      noSpaces:= saux;
    end;
    Bonne journée.

  11. #31
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Ho,
    Citation Envoyé par Ultima
    Bonjour,

    Je propose ce code ci, il me semble qu’il n’est pas très compliqué et fait bien son boulot.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function noSpaces( s : STRING ) : STRING;
    var  i : BYTE;
         saux : STRING;
    Begin
      saux:= '';
      for i:= 1 to length(s) do
        if not( s[i] = ' ') then saux:= saux+s[i];
      noSpaces:= saux;
    end;
    Bonne journée.
    Cela impose l'utilisation d'une string en tampon, on peut s'en passer.

    D'autre part, pourquoi se limiter à un Byte pour la longueur de la chaîne ? Cela spécialise ta fonction pour les chaînes "classiques", et ne marchera plus pour les chaînes type "ansiString" par exemple, qui peuvent avoir une longueur bien supérieure.

    Ça ne sert absolument à rien, même pas à économiser de la mémoire, car le compilateur va ligner les données sur la taille du mot mémoire du processeur, cela d'autant plus que les variables locales sont réservées dans la pile, qu'il ne faut pas désaligner, sous peine d'ennuis certaines.
    Et la string tampon que tu utilises en consomme beaucoup plus que ce que tu pourrais espérer gagner, si le problème d'alignement n'existait pas.

    Tu perds également en vitesse, car les processeurs modernes n'aiment pas traiter des données de longueur inférieure à leur largeur native (32 ou 64 bits, actuellement).
    Si les cons volaient, il ferait nuit à midi.

  12. #32
    Membre actif Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Points : 261
    Points
    261
    Par défaut
    Bonjour,
    Merci Droggo, t'as l'aire très bon.
    Comment puis-je travailler sur des chaînes d’une longueur supérieure à 255 caractères ?
    Comment déclarer ce genre de chaîne ? Et Quelle est leur taille ?
    Comment me passer d’une variable intermédiaire pour la fonction que j’ai proposée ?

    En fait je suis débutant en pascal si tu pouvais me dire où tu trouves tes tutoriaux, ce serait impeccable.
    Encore merci et à plus.

  13. #33
    Membre actif Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Points : 261
    Points
    261
    Par défaut
    Bonjour,
    Mes trois premières questions sont résolues, je crois...
    Il m’a suffit de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    begin
      writeln('taille AnsiSTRING : ',sizeof(AnsiSTRING),' Octets');
      writeln('Soit : ',sizeof(AnsiSTRING)*256,'-1 caract'#138'res');
    end.

  14. #34
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hi,
    Citation Envoyé par Ultima
    Bonjour,
    Mes trois premières questions sont résolues, je crois...
    Il m’a suffit de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    begin
      writeln('taille AnsiSTRING : ',sizeof(AnsiSTRING),' Octets');
      writeln('Soit : ',sizeof(AnsiSTRING)*256,'-1 caract'#138'res');
    end.
    Et qu'obtiens-tu en affichage ?

    En fait, la taille possible pour une ansiString peut dépendre du compilateur. En Delphi par exemple, ça peut aller jusqu'à 2^31, soit 2 Giga Bytes !!
    Les compilateurs ne connaissent pas tous ce type de chaine, Turbo Pascal, entre autres.

    Le "sizeof(AnsiSTRING)" ne te donne pas la taille possible d'une chaine de ce type.

    Pour te passer de chaine intermédiare, remonte dans les messages, Alcatîz a donné une solution (qu'il faut corriger comme l'a fait Mushroom7), et également corriger en remplaçant les byte, comme pour ta version, pour ne pas se limiter aux chaines classiques du Pascal, de longueur maximale 255 caractères.

    Côté tutoriaux (en français, on dit "didacticiels"), vois ceux du site, je ne sais pas s'il en existe, les ansiString n'ayant pas grand chose de différent des string classiques, hormis la longueur maximale, et le fait qu'on ne peut pas mettre la longueur effective en faisant [b}chaine[0] = la_longueur[/b]
    Si les cons volaient, il ferait nuit à midi.

  15. #35
    Membre actif Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Points : 261
    Points
    261
    Par défaut
    Bonjour,
    voici je que j'obtiens:
    >
    taille AnsiSTRING : 4 Octets
    Soit : 1024-1 caractères
    Je suis très étonné car j’ai remarqué que je peux stocker 335 caractères dans une chaine du type STRING et 1584201679 caractères dans une chaine du type AnsiString.

    Pour les Ansistring, je ne sais pas si c’est normal, mais pour les STRING, je croyais que c’été 255.

    pour vérifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var s : String;
        i : CARDINAL;
    begin
      for i:= 1 to 1000 do
      begin
        writeln(i);
        setlength(s, i);
      end;
    Remarque : J’utilise FreePascal.

  16. #36
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Lorsqu'il n'y a pas de spécification de longueur, Free Pascal considère que le type String est une AnsiString. Pour utiliser les strings de Turbo Pascal, il faut soit utiliser le type ShortString, soit la directive de compilation {$H-}.

    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  17. #37
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Ha,
    Citation Envoyé par Ultima
    Bonjour,
    Mes trois premières questions sont résolues, je crois...
    Il m’a suffit de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    begin
      writeln('taille AnsiSTRING : ',sizeof(AnsiSTRING),' Octets');
      writeln('Soit : ',sizeof(AnsiSTRING)*256,'-1 caract'#138'res');
    end.
    J'avais oublié de te demander: à quoi est censé correspondre le calcul
    sizeof(AnsiSTRING)*256,'-1
    ??

    Petit supplément : en FreePascal, les ansiString sont très particulières, puisque imitant les chaînes de caractères du C : c'est un caractère de code 0 qui les termine, ce qui est un comportement très bizarre pour du Pascal.

    Je n'ai pas fait de tests, mais, a priori, cela doit poser des problèmes de vitesse d'exécution quand on utilise la longueur de la chaine avec length(chaine), car
    Citation Envoyé par freePascal Doc
    Ansistrings are strings that have no length limit. They are reference counted and null terminated.
    ce qui impose d'"éplucher" toute la chaine pour en trouver la fin, donc la longueur [par définition, une "longueur sans limite" ne saurait être stockée dans une variable entière, quelle qu'en soit la précision]
    Si les cons volaient, il ferait nuit à midi.

  18. #38
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par droggo
    Petit supplément : en FreePascal, les ansiString sont très particulières, puisque imitant les chaînes de caractères du C : c'est un caractère de code 0 qui les termine, ce qui est un comportement très bizarre pour du Pascal.

    Je n'ai pas fait de tests, mais, a priori, cela doit poser des problèmes de vitesse d'exécution quand on utilise la longueur de la chaine avec length(chaine), car

    ce qui impose d'"éplucher" toute la chaine pour en trouver la fin, donc la longueur [par définition, une "longueur sans limite" ne saurait être stockée dans une variable entière, quelle qu'en soit la précision]
    L'API Windows travaillant exclusivement avec des chaînes à zéro terminal, il est logique qu'elles aient été incluses dans le langage Pascal : d'abord avec Turbo Pascal for Windows puis avec Delphi.

    En matière de performances, la recherche du zéro terminal n'est guère pénalisante : un simple rep cmpsb suffit. Le maintien de l'attribut de longueur, par contre, nécessite des instructions supplémentaires.
    Car les AnsiStrings (apparues avec Delphi) ont un attribut de longueur codé sur 32 bits; voici leur structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Var s : String;
    ...
    s := 'Bonjour';
    - s contient un pointeur vers un bloc dans le tas global;
    - le bloc est structuré comme suit :
    • à l'adresse ( s - 8 ) : compteur de références (dword);
    • à l'adresse ( s - 4 ) : longueur de la chaîne (dword);
    • à l'adresse s : 'Bonjour'#0#0


    Les tableaux de caractères pChar (apparus avec Turbo Pascal for Windows), par contre, n'ont aucun attribut de longueur, juste un zéro terminal.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  19. #39
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hi,
    Citation Envoyé par Alcatîz
    En matière de performances, la recherche du zéro terminal n'est guère pénalisante : un simple rep cmpsb suffit.
    Et tu penses que ça se fait instantanément ?

    Essaye avec des chaines de 10000, ou 100000, ou plus, caractères. Ça va vite, mais ce n'est pas du tout la même chose que simplement lire la valeur d'un entier.

    Citation Envoyé par Alcatîz
    Car les AnsiStrings (apparues avec Delphi) ont un attribut de longueur
    J'ai vu en faisant des tests de vitesse.

    Mais, cet attribut est incompatible avec la doc que j'ai citée plus tôt :
    Citation Envoyé par freePascal Doc
    Ansistrings are strings that have no length limit. They are reference counted and null terminated.
    même avec 32 bits pour stocker la longueur, ça ne permet pas d'avoir des chaînes infinies.
    C'est très largement au-delà de l'usage courant, certes, mais pas infini
    Si les cons volaient, il ferait nuit à midi.

  20. #40
    Membre actif Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Points : 261
    Points
    261
    Par défaut
    Citation Envoyé par droggo
    J'avais oublié de te demander: à quoi est censé correspondre le calcul sizeof(AnsiSTRING)*256,'-1 ??
    Bonjour, ça ne sert à rien, (je n’ose pas dire ce qui me passé par l’esprit quand j’ai écrit ça).

Discussions similaires

  1. [WebI XiR2] Suppression d'un espace dans une chaîne de caractères
    Par SGA99 dans le forum Débuter
    Réponses: 6
    Dernier message: 02/12/2010, 17h12
  2. suppression des espaces d'une chaîne de caractère
    Par tubaas dans le forum MATLAB
    Réponses: 6
    Dernier message: 18/03/2010, 20h19
  3. Réponses: 1
    Dernier message: 16/06/2009, 17h32
  4. Suppression des espaces ds une chaîne
    Par petitnuage dans le forum Langage
    Réponses: 2
    Dernier message: 04/06/2006, 15h59
  5. Suppression d'espaces dans une chaîne
    Par dafalri dans le forum Langage
    Réponses: 11
    Dernier message: 20/02/2006, 13h13

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