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 :

créé un tableau d'objet


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Points : 12
    Points
    12
    Par défaut créé un tableau d'objet
    Bonujour, j'essaie de m'initier au c++, et je me retrouve face a un probleme : je ne comprends pas comment faire pour créé un tableau d'objet. Pour m'entrainer au c++ j'ai recuperé les sujets de la piscine de l'ecole 42 (j'en suis d01 ex03 : https://github.com/jpirsch/piscines/.../d01.en(1).pdf).

    J'essaie donc de faire un objet, qui peux créé un tableau d'objet.
    Voici mon code :
    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
    #ifndef ZOMBIEHORDE_HPP
    # define ZOMBIEHORDE_HPP
     
    #include <iostream>
    #include <stdlib.h>
    #include "Zombie.hpp"
    #include "ZombieEvent.hpp"
     
    class ZombieHorde {
     
    private:
    	Zombie	*horde[];
     
    public:
    	ZombieHorde(int nbrZombie);
    	void	announce(void);
    };
     
    # endif
    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
    #include "ZombieHorde.hpp"
     
    ZombieHorde::ZombieHorde(int nbrZombie) {
    	srand(time(0));
    	ZombieEvent	zombie_event("Infecté");
    	std::string	tab[] = {"Daniel", "Moncef", "Louis", "John", "Phillipe"};
    	int			i = 0;
     
    	while (i < nbrZombie) {
    		this->horde[i] = zombie_event.newZombie(tab[rand() % 5]);
    		i++;
    	}
    	this->horde[i] = NULL;
    }
     
    void	ZombieHorde::announce(void) {
    	int	i = 0;
     
    	while (this->horde[i] != NULL) {
    		this->horde[i]->announce();
    		i++;
    	}
    }
     
    int	main(void) {
    	ZombieHorde	horde(5);
    	horde.announce();
    }
    Mais mon programme me retourne soit un bus error soit une segmentation fault :
    <Louis (Infecté)> Braiiiiiiinnnssss...
    <Daniel (Infecté)> Braiiiiiiinnnssss...
    <Phillipe (Infecté)> Braiiiiiiinnnssss...
    <Phillipe (Infecté)> Braiiiiiiinnnssss...
    <Louis (Infecté)> Braiiiiiiinnnssss...
    [1] 89101 bus error ./zombie
    J'avoue etre un peu perdu, je ne vois pas ce qui cloche dans ma classe...
    J'ai lu sur le net que la fonction vector() pourrait m'aider, mais j'aimerais joué le jeu et faire sans (cette fonction n'est pas autorisé pour les etudiants qui font cette piscine apparemment)
    Sachant que je n'ai pas encore fait le destructeur, ca doit venir de lui, parce qu'on dirait que c'est au moment ou le programme se ferme, quoi que je mette dans le programme, ca va s'executer, et mettre le segfault ensuite.
    Mais meme en sachant ca je ne vois pas pourquoi il pourrait segfault

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ton code n'a aucune chance de fonctionne.
    Zombie *horde[]; est un tableau de pointeur de Zombie de taille inconnu. Tu ne pourras pas insérer de données là-dedans.
    Un tableau c'est std::vector ou std::array, selon que sa taille est connue à la compilation ou non.

    Edit: on dirait qu'il y a une règle plutôt stupide qui interdit d'utiliser la stl avant l'exo 8... Donc ce qu'ils attendent c'est Zombie* horde ou Zombie** horde si tu veux des pointeurs, et l'utilisation de new[]/delete[].
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Rassure-moi, c'est comme en C, ils n'ont pas changer ça : Zombie **horde revient exactement au meme que Zombie *horde[] ?

    EDIT: Merci ! J'ai trouvé. (avec ca comme code pour ceux qui seraient interessés :)
    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
    #include "ZombieHorde.hpp"
     
    ZombieHorde::ZombieHorde(int nbrZombie) : nbrZombie(nbrZombie) {
    	srand(time(0));
    	std::string	names[] = {"Daniel", "Moncef", "Louis", "John", "Phillipe"};
    	int			i = 0;
     
    	this->horde = new Zombie*[nbrZombie];
    	while (i < this->nbrZombie) {
    		this->horde[i] = new Zombie(names[rand() % 5], "Infecté");
    		i++;
    	}
    }
     
    void	ZombieHorde::announce(void) {
    	int	i = 0;
     
    	while (i < this->nbrZombie) {
    		this->horde[i]->announce();
    		i++;
    	}
    }
     
    int	main(void) {
    	ZombieHorde	horde(22);
    	horde.announce();
    }
    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
    #ifndef ZOMBIEHORDE_HPP
    # define ZOMBIEHORDE_HPP
     
    #include <iostream>
    #include <stdlib.h>
    #include "Zombie.hpp"
    #include "ZombieEvent.hpp"
     
    class ZombieHorde {
     
    private:
    	int		nbrZombie;
    	Zombie	**horde;
     
    public:
    	ZombieHorde(int nbrZombie);
    	void	announce(void);
    };
     
    # endif

  4. #4
    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
    Citation Envoyé par Deezio Voir le message
    Rassure-moi, c'est comme en C, ils n'ont pas changer ça : Zombie **horde revient exactement au meme que Zombie *horde[] ?
    Je te rassure c'est comme en C, mais en C++ on préfère éviter les tableaux dits "bruts" car même les développeurs C en oublient les subtilités.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    extern char tab1[];              // tableau de taille non définie
    extern char tab1[10];            // idem tableau de taille non définie!
    char tab2[] = {1,2,3,4,5}       // tableau de taille connue (ici 5), en C++ on préfère ôter le '='.
    void fct( char tab3[] );         // pointeur sur un entier
    void fct( char* tab3 );          // idem, pointeur sur un entier
    void fct( char tab3[12] );       // idem, pointeur sur un entier!
    void fct( char tab4[static 3] ); // Ça c'est du C, pas du C++
    void fct( char (&tab5)[5] );     // Ça c'est du C++, pas du C
    template<size_t N> void fct(char (&tab6)[N]); // Ça aussi c'est du C++
    sizeof(tab1)==sizeof(tab3)==sizeof(tab4)==sizeof(void*), sizeof tab2==sizeof tab5==4, sizeof(tab6)==taille du tableau passé.
    Citation Envoyé par Deezio Voir le message
    EDIT: Merci ! J'ai trouvé. (avec ca comme code pour ceux qui seraient interessés
    Attention quand même, ce code est un très mauvais exemple à ne pas reproduire. C'est peut-être dû aux recommandations de l'école 42; mais il y a de graves lacunes (p.e l'objet ZombieHorde ne doit pas être instancié plusieurs fois, ou copié sans risquer de sérieuses anomalies...)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Le probleme avec ma class vient surement du Zombie **horde, qui ne pourra pas être copié c'est ca ? Alors que faudrait il utilisé ici ? Des std::vector ou std::array c'est bien ca ?
    Par contre je ne vois pas ce qui bloquerait le fait de faire plusieurs instances

  6. #6
    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
    * En fait la copie va "plus" que fonctionner, avec une copie ultra-rapide mais qui produit des objets "siamois" impossible à libérer correctement.
    * En effet utiliser des collections permettra de gérer correctement les allocations, les copies et les éventuelles exceptions. Sinon on peut le faire "à la main", mais il y a de nombreuses choses à écrire avec de nombreux risques d'erreur (des constructeurs et opérateurs de copie, un destructeur et le constructeur à corriger.)
    * Ici, il n'a aucune libération de mémoire. Si on multiplie les instances, on multiplie la mémoire perdue et l'application pourra tomber par manque de mémoire.

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

Discussions similaires

  1. retour tableau d'objets par service web axis jboss
    Par TrollMaster dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 27/11/2005, 21h45
  2. Tableau d'objets
    Par moulefrite dans le forum MFC
    Réponses: 7
    Dernier message: 15/06/2004, 14h14
  3. Sauvegarde / Chargement d'un tableau d'objets
    Par Naruto dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 14h34
  4. [VB6]Tableau d'objet withevents
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/02/2004, 19h44
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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