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 :

SetLength et les strings ?


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2
    Par défaut SetLength et les strings ?
    Bonjour,

    Une question sur l'utilisation de setlength avec une string : setlength alloue de la mémoire pour la chaine. Mais si j'affecte une valeur à la chaîne, la mémoire allouée change-t-elle automatiquement ?

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Procedure Test;
    Var S : String;
    Begin
      SetLength(S, 100); // 100 octets alloués pour S
      S := 'Toto';      // toujours 100 octets pour S ? 
                        // ou Delphi a-t-il réorganisé la mémoire ? 
    end;
    Existe-t-il un moyen de connaître la mémoire allouée pour une string ?

    Merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 74
    Par défaut
    salut, j'veux pas dire de bétise mais je crois que le setlength ne sert à rien appliqué à String (les string sont gérés par Delphi).
    Par exemple si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    setlength(machaine,0);
    machaine := 'toto';
    il va bien mettre 'toto' dans machaine sans planter.

  3. #3
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Citation Envoyé par kirua2150
    salut, j'veux pas dire de bétise mais je crois que le setlength ne sert à rien appliqué à String (les string sont gérés par Delphi).
    Par exemple si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    setlength(machaine,0);
    machaine := 'toto';
    il va bien mettre 'toto' dans machaine sans planter.
    Ça vient de l'aide de Delphi 7 :

    For a long-string or dynamic-array variable, SetLength reallocates the string or array referenced by S to the given length. Existing characters in the string or elements in the array are preserved, but the content of newly allocated space is undefined.

  4. #4
    Membre chevronné Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Par défaut
    Extrait de l'aide Delphi 7 (en Français bien-sûr) :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Quand vous déclarez une chaîne longue :
    
    S: string;
    
    il n'est pas nécessaire de l'initialiser. Les chaînes longues sont automatiquement initialisées vides. Pour tester si une chaîne longue est vide, vous pouvez utiliser la variable EmptyStr :
    
      S = EmptyStr;
    
    ou la comparer à une chaîne vide :
    
      S = '';
    
    Une chaîne vide ne contient pas de données utilisables. Donc, essayer d'accéder par indice à une chaîne vide est similaire à l'accès à nil et provoque une violation d'accès :
    
    var
      S: string;
    begin
      S[i];  // cela provoque une violation d'accès
      // instructions
    end;
    
    De même, si vous transtypez une chaîne vide en un PChar, le résultat est un pointeur nil. Donc, si vous transmettez un tel PChar à une routine qui doit le lire ou l'écrire, la routine doit gérer la valeur nil :
    
    var
      S: string;  // chaîne vide
    begin
      proc(PChar(S));  // assurez-vous que proc peut gérer nil
      // instructions
    end;
    
    Si ce n'est pas le cas, vous devez initialiser la chaîne :
    
      S := 'No longer nil';
      proc(PChar(S));  // proc n'a plus besoin de gérer nil
    
    ou vous devez en spécifier la longueur en utilisant la procédure SetLength :
    
      SetLength(S, 100);  // attribue à la chaîne S une longueur dynamique 100
      proc(PChar(S));  // proc n'a plus besoin de gérer nil
    
    Quand vous utilisez SetLength, les caractères existant déjà dans la chaîne sont préservés mais le contenu de l'espace nouvellement alloué est indéterminé. Après un appel à SetLength, S est certain de référencer une chaîne unique, c'est-à-dire une chaîne avec un compteur de référence à 1. Pour connaître la longueur d'une chaîne, utilisez la fonction Length.
    
    N'oubliez pas qu'une chaîne déclarée de la manière suivante :
    
      S: string[n];
    
    est implicitement une chaîne courte et pas une chaîne longue de longueur n. Pour déclarer une chaîne longue ayant spécifiquement la longueur n, déclarez une variable de type chaîne, puis utilisez la procédure SetLength :
    
      S: string;
      SetLength(S, n);

  5. #5
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Length(maChaine) ?

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 135
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 135
    Par défaut
    Yep !

    Un "must read" sur les strings (trouvé le lien qq part ici ou sur un autre forum)

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Par défaut
    Citation Envoyé par c_icla
    Mais si j'affecte une valeur à la chaîne, la mémoire allouée change-t-elle automatiquement ?
    Oui. Pour plus de détails, voir ici :
    http://reisubar.developpez.com/tutor...trings-pchars/

    Citation Envoyé par c_icla
    Existe-t-il un moyen de connaître la mémoire allouée pour une string ?
    Pour un AnsiString, la taille en octets est implicitement donnée par la fonction Length().

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2
    Par défaut Ok, c'est clair
    Le tutorial est très détaillé.

    Mon souci était d'éviter de déclencher une exception OutOfMemory (l'objet sert à gérer les erreurs).
    La solution la plus simple est donc de passer par un PChar, lui allouer sa mémoire en début de programme et la désallouer à la fin.

    Merci.

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

Discussions similaires

  1. Lecture de fichier : Probleme avec les string
    Par soda_o_rat dans le forum SL & STL
    Réponses: 10
    Dernier message: 11/08/2005, 22h59
  2. Realiser des tests exhaustifs sur les String
    Par Sarrus dans le forum Langage
    Réponses: 9
    Dernier message: 07/07/2005, 11h52
  3. Réponses: 4
    Dernier message: 10/03/2005, 14h10
  4. [Fichiers] BlockRead/Write et les Strings
    Par Clorish dans le forum Langage
    Réponses: 5
    Dernier message: 14/01/2005, 21h28
  5. probleme avec requete sql aime pas les strings
    Par lil_jam63 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/02/2004, 14h45

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