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 :

[debutant C++] problèmes d'allocations de chaines et concaténation, etc.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 99
    Par défaut [debutant C++] problèmes d'allocations de chaines et concaténation, etc.
    Bonjour,

    Je suis dans les phases finales de mon projet... mais bon sang j'aimerai pouvoir m'en sortir, parce que là, c'est assez.

    Dans mon programme j'alloue fréquemment des zones pour des chaines de caractères. C'est parce que le SDK de géoconcept fonctionne comme ça. (parfois j'utilise des strings, mais je souhaite apprendre, donc manipuler les chaines de caractère ça me semble une bonne chose).

    Passé les affres des différentes syntaxes pour l'initialisation (pas sûr d'avoir bien saisi quand même), je me suis dis qu'il serait bien d'avoir des fonctions de concaténation et de copie qui s'occupent toutes seules de la mémoire à allouer, respectivement strcat_d() et strcpy_d() (_d pour daniel...)

    Les voici:

    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
    char * strcat_d(char** but, const char* source)
    /**permet de concatener sans s'occuper de la memoire... j'espere*/
    {
    	if(source	== NULL) return *but;
    	if(but		== NULL) return *but;
    	if(*source	== NULL) return *but;
    	if(*but		== NULL) return *but;
     
    	UINT lenFinale	= strlen(*but) + strlen(source) + 1;
    	char * butSauf	= *but;
    	*but		= NULL;
    	*but		= new char[lenFinale];
    	strcpy(*but, butSauf);
    	delete butSauf;
    	butSauf		= NULL;
    	strcat(*but, source);
    	return *but;
    }
     
    char * strcpy_d(char** but, const char* source)
    /**permet de copier sans s'occuper de la memoire... j'espere*/
    {
    	if(source	== NULL) return *but;
    	if(but		== NULL) return *but;
    	if(*source	== NULL) return *but;
    	if(*but		== NULL) return *but;
     
    	UINT lenFinale	= sizeof(source);
    	char * butSauf	= *but;
    	delete butSauf;
    	butSauf		= NULL;
    	*but		= NULL;
    	*but		= new char[lenFinale];
    	strcpy(*but, source);
    	return *but;
    }
    Je les teste avec le prog suivant:
    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
    void main()
    {
    	int i = 0;
    	while(i<10000000)
    	{
    		char *mama	= new char;
    		mama[0]		= 0;
    //		strcpy_d(&mama, "hahahaihioyuiohoha");  //  --1--
    		strcat_d(&mama, "patatipatata")             // --2--
    		printf("%s", mama);
    		delete  mama;
    		i++;
    	}
    	return;
    }
    Quand je commente 1 OU 2 ça marche impecc et sur 10000000 boucles, ya pas de fuite.
    Quand je décommente les deux ça plante sur la 2ème fonction et ce quel que soit l'ordre. Le déboggueur me dit que c'est sur le "delete butSauf;" de la fonction qui vient en 2. (je pense qu'il faudrait un [] dans ce cas là)

    Si je fais "char *mama = new char[];" puis "delete [] mama" (ce qui me semblerait logique) strcpy() plante mais pas strcat(). Le déboggueur me signale que c'est sur "delete [] mama;" que ça accroche dans ce cas là.

    Je crois comprendre qu'il y a un problème avec mes "[]". Quelqu'un voit-il comment résoudre ce problème? J'ai envisagé de faire des tests sur la taille de *butSauf (l'objet pointé) pour savoir si je dois utiliser "delete [] ..." ou "delete tout court" mais ça ne me parait pas correct.

    Je fais vraiment ça pour apprendre, je pense pouvoir utiliser des strings, mais je voudrai comprendre. Si vous pouvez m'aider, j'en serais heu-reux ^^.
    Puis si ces deux fonctions pouvaient marcher impecc, mon prog en serait globalement heureux lui aussi!

    Merci pour nous deux alors
    Daniel

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Genre t'as
    UINT lenFinale = sizeof(source);
    Et tu te demandes pourquoi ça marche pas ?
    Compare avec ton code pour strcat_d, ça devrait être évident...

    Après y'a d'autres problèmes comme par exemple des mélanges entre new/delete et new[]/delete[].
    Sans parler du fait que ce n'est pas optimal du tout.

    De toutes façons, c'est hyper mal conçu comme truc, et très crade. Si tu veux apprendre, tu ferais mieux de coder ton propre type string.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 99
    Par défaut
    Genre t'as

    Citation:
    UINT lenFinale = sizeof(source);

    Et tu te demandes pourquoi ça marche pas ?
    Compare avec ton code pour strcat_d, ça devrait être évident...
    Héhé, genre, ouais, avant de faire ça j'ai qd mm testé. Je mets pas le code qui ma permis de tester, ça serait insultant!
    strlen me renvoie le nombre de caractères sans le nul final.
    sizeof(...) me renvoie la longueur totale.
    Du coup, quand j'alloue de la mémoire, il me faut bien prendre en compte le caractère de fin, donc soit strlen(...) + 1, soit sizeof(...) non? si?

    Après y'a d'autres problèmes comme par exemple des mélanges entre new/delete et new[]/delete[].
    Je crois aussi que c'est le principal problème.

    Sans parler du fait que ce n'est pas optimal du tout.
    ça c'est l'étape d'après!

    De toutes façons, c'est hyper mal conçu comme truc, et très crade.
    Mince, moi qui croyais que c'était le plus beau code du monde, me voilà déçu!

    Si tu veux apprendre, tu ferais mieux de coder ton propre type string
    ça c'est encore après! tu crois pas?

    en te remerciant,
    Daniel

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par mangobango
    strlen me renvoie le nombre de caractères sans le nul final.
    sizeof(...) me renvoie la longueur totale.
    char s1[] = "Abcdefgh";
    char *s2 = s1;

    sur une machine où sizeof(void*) == 4, on aura sizeof(s1) == 9, mais sizeof(s2) = 4. s2 a comme type char*, et rien d'autre, et à part un astuces comme de parcourir la chaîne pour trouver un zéro final (ou savoir comment est implémenté new[]), il n'y a pas moyen avec un sizeof de savoir combien d'éléments sont contenus après l'adresse pointée par un pointeur.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hui,
    Citation Envoyé par mangobango
    Héhé, genre, ouais, avant de faire ça j'ai qd mm testé. Je mets pas le code qui ma permis de tester, ça serait insultant!
    Pour qui ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 99
    Par défaut
    (insultant pour quiconque aurait un meilleur niveau que moi , environ 99.9% des gens ici)

    Alors je vois la coquille! Pour finir ce projet je vais me rabattre sur les strings de la biblio standard.

    Merci à nouveau pour l'aide,
    ( plus tard je me pencherai sur implémenter mes strings moi même, mes tables de hashages et un compilateur customizé ^^ )

    Aller, ciao
    Dani

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/08/2004, 10h59
  2. [Debutant(e)]problème de variable d'environnement
    Par tolsam dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 12/08/2004, 19h08
  3. [Debutant(e)] Problème fichier texte et vue
    Par solenn dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 21/07/2004, 09h23
  4. [debutant][Gregoriancalendar] Problème avec le set
    Par britou dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 30/06/2004, 16h01
  5. Réponses: 4
    Dernier message: 16/04/2004, 16h31

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