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

 C++ Discussion :

string::max_size renvoie des valeurs incohérentes


Sujet :

C++

  1. #1
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut string::max_size renvoie des valeurs incohérentes
    bonjour,
    J'essaye de dire à une chaine qu'elle est plus long que 213 caractères.
    J'ai codé
    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
    	void CInterbaseManagerM::Display( Exception^ exception)
    	{
    	    char ErrorString[2048];
    		std::string ErrorStr;
    		std::string terme1;
    		std::string terme2;
    		std::string terme3;
    		std::wstring wsName;
    		char* ErrorT;
    		const wchar_t* chars;
    		int len;
     
    			terme1 = "Index #";
    			terme2 = "\n";
    			terme3 = "Error: ";
    			System::String^ ErrorText = exception->Message;
    			chars = (const wchar_t*)(Marshal::StringToHGlobalUni( ErrorText)).ToPointer();
    			wsName.append( chars);
    			ErrorT = CStrConv::awcstombs( (wchar_t*)chars);
    			Marshal::FreeHGlobal(IntPtr((void*)chars));
    			int maxSize = 300;
    			maxSize = ErrorStr.max_size();
    			int CurrSize = ErrorStr.capacity();
    			ErrorStr = terme1 + terme2 + terme3;
    			len = ErrorStr.size();
    			ErrorStr = "";
    			ErrorStr += ErrorT + terme2;
    			CStrConv::StrFreeA( ErrorT);
    			edit( (char*)ErrorString);
    	}
    il y a deux appels à de primitives de basic_string L'appel de max_size() et l'appel de capacity()
    mais ces appels ne donnent pas le bon résultat

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Une std::string ajuste dynamiquement sa taille en fonction du besoin.
    basic_string<>::max_size() est la taille de la plus grande chaine, ne dépend que du compilateur et vaut classiquement 4 milliards.
    basic_string<>::size() est la longueur actuelle de la chaine
    basic_string<>::capacity() est la taille réservée pour la chaine donc toujours >= basic_string<>::size().
    on peut appeler basic_string<>::reserve() pour augmenter la capacity. L'intérêt de reserve est d'optimiser par anticipation la réservation de mémoire; mais souvent dans ces cas, il est préférable d'utiliser des std::stringbuf.

    Dans ton exemple, tu lis capacity() puis immédiatement après il y a une concaténation qui provoque quasi-systématiquement un changement automatique de capacity.
    Et ne pas confondre avec les System::String du C++/CLR, donc avec une tout autre gestion.

    Ton besoin est peut-être de préparer un buffer avant remplissage, et au mieux c'est ErrorStr.capacity(300) qu'il faut appeler,
    puis enchainer par edit( const_cast<char*>(ErrorStr.data()) ) , mais cela est très inopportun.
    Peux-tu préciser le problème?

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

Discussions similaires

  1. [WD10] Renvoie des valeurs
    Par karim.net7 dans le forum WinDev
    Réponses: 5
    Dernier message: 13/07/2010, 16h52
  2. Remplacer des balises par des valeurs dans une String
    Par RadicalBob dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2007, 15h22
  3. [Tableaux] Foreach renvoie des valeurs double en php4
    Par Dantahoua dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2007, 17h49
  4. Recordset vide alors que la requete renvoie des valeurs
    Par lepiou dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 07/06/2006, 10h36
  5. [Débutant] Liste avec des valeurs associées aux string
    Par Bouillou dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/03/2006, 18h11

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