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 :

tableau de struct qui contient un char*


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut tableau de struct qui contient un char*
    Bonjour,
    J'ai une structure test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct test
    {
    	char *ch;
    	int i;
    };
    je veux avoir un tableau de struct qui contient 5 éléments, par exemple, de ma structure test
    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
     
    std::vector<test> v;
    void mTest()
    {
    	for(int i=0; i<5; i++)
    	{
    		char buf[255];
    		sprintf(buf,"%d",i);
     
    		//v.clear();
    		test t;
    		t.ch = buf;
    		t.i = i;
    		std::cout << t.ch << "   " << t.i << std::endl;
    		v.push_back(t);
    	}
    }
    puis dans le main j'affiche le tableau de struct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	mTest();
    	for(int i=0; i<5; i++)
    	{
    		std::cout << v.at(i).ch << "   " << v.at(i).i << std::endl;
    	}
    	system("pause");
    	return 0;
    }
    le problème est que lorsque j'affiche les éléments du tableau, le contenu de la chaîne est perdu ou je sais pas,
    voici le résultat
    0 0
    1 1
    2 2
    3 3
    4 4
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╚█←g☺╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠Þ ╠╠╠╠╠╠╠╠ 0
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╚█←g☺╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠Þ ╠╠╠╠╠╠╠╠ 1
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╚█←g☺╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠Þ ╠╠╠╠╠╠╠╠ 2
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╚█←g☺╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠Þ ╠╠╠╠╠╠╠╠ 3
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
    ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╚█←g☺╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠Þ ╠╠╠╠╠╠╠╠ 4
    Appuyez sur une touche pour continuer...
    comment puis-je corriger cette erreur
    Merci d'avance

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Pourquoi ne pas utiliser des std::string plutôt que des tableaux de caractères ?

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Déjà, y a-t-il une raison particulière pour l'utilisation d'un char * au lieu d'une std::string

    Tu t'éviterais surement bien des soucis en manipulant cette dernière

    autrement, si pour une raison qui ne dépend que de toi (mais que l'on pourrait sans doute démonter ), tu te trouves face à la nécessité absolue d'utiliser un char *, il faut penser au fait que les collections de la stl gèrent... des copies des objets que l'on insère dedans (sauf quand on crée une collection de pointeurs)

    Il faudrait donc veiller à définir un constructeur par copie efficace qui effectue une "deep copy" de ch...

    en outre, et c'est sans doute le pire, buf est créé de manière statique (par opposition à "dynamique", avec new ) et arrête donc d'exister ... à l'accolade fermante qui englobe le contenu de la boucle !

    il n'y a donc rien d'étonnant à ce que les pointeurs ch de tes structures pointent sur des adresses invalides
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Iran

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Points : 40
    Points
    40
    Par défaut
    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
    std::vector<test> v;
    void mTest()
    {
            for(int i=0; i<5; i++)
            {
                    char buf[255];
                    sprintf(buf,"%d",i);
    
                    //v.clear();
                    test t;
                    t.ch = strdup(buf);
                    t.i = i;
                    std::cout << t.ch << "   " << t.i << std::endl;
                    v.push_back(t);
            }
    }
    buf est une variable locale et est perdu après mtest().
    donc t.ch pointe sur une adresse invalide.
    vous pouvez utiliser strdup(). mais n'oubliez pas de libérer la mémoire

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par arash Voir le message
    vous pouvez utiliser strdup(). mais n'oubliez pas de libérer la mémoire
    Conseiller des APIs C alors que Koala a fourni tous les éléments de réponse en C++, ce n'est franchement pas une bonne idée.
    Find me on github

  6. #6
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    merci
    pb résolu avec le std::string

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

Discussions similaires

  1. Tableau initialisé à 0 qui ne contient pas 0
    Par drics dans le forum Débuter
    Réponses: 2
    Dernier message: 18/03/2011, 16h11
  2. Réponses: 4
    Dernier message: 21/06/2010, 01h19
  3. Vérifier un champs qui contient un tableau
    Par jeremygata dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/05/2008, 16h39
  4. Réponses: 3
    Dernier message: 07/06/2007, 16h03

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