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 :

Problème d'insertion d'un objet dans un autre objet de type tableau "Plateau"


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Problème d'insertion d'un objet dans un autre objet de type tableau "Plateau"
    Bonjour,

    J'ai un projet de C++ pour cette année qui a pour but de "gérer" le déplacement d'une population de fourmis (Ouais assez bizarre comme projet )
    (Il y a des règles de déplacement pour les fourmis)

    Pour cela on a implémenté les classes suivantes:
    Etat (les états des cases du plateau : afin d'avoir leurs direction et de savoir si elles sont occupées ou pas)
    Plateau (Il contient la hauteur et la largeur du quadrillage, ainsi qu'un double pointeur de type Etat: Etat** tab)
    Fourmi (C'est ici où j'ai le problème, on nous demande d'insérer la fourni dans la case milieu du plateau via un constructeur qui prends en paramètre la référence du plateau)
    Fourmilière (Je suis pas encore arrivé à cette partie donc on en aura pas besoin)

    Je ne vais pas exposer la totalité de mes codes par peur que d'autres élèves de la même école puissent les réutiliser pour leurs faveurs. (Sachant que c'est un projet individuel et il y a des vérifications pour les cheaters).


    Etat.h

    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
    #pragma once
    #include <iostream>
    using namespace std;
    class Etat
    {
    private:
    	bool occupe;
    	int direction;
    public:
    	Etat();
    	Etat(bool o, int d);
    	bool get_o();
    	int get_d();
    	void set_o(bool o);
    	void set_d(int d);
    	void modif_d();
    	void AfficherEtat();
    };
    Plateau.h

    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
    #pragma once
    #include "Etat.h"
    #include <iostream>
    using namespace std;
     
    class Plateau
    {
    private:
    	Etat** tab;
    	int hauteur, largeur;
     
    public:
     
    	Plateau();
    	Plateau(int h, int l);
    	Plateau(Plateau const& CopiePlateau);
    	~Plateau();
     
    	void affiche();
    	Etat& get_case(int i, int j);
    	int get_h();
    	int get_l();
    	Plateau operator++ (int);
    };
    Fourmi.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #pragma once
    #include "Plateau.h"
    class Fourmi
    {
    private:
    	int i,j;
    	int d;
    public:
    	Fourmi(Plateau& plat);
    	int get_d();
     
    };
    Fourmi.cpp

    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
    #include "Fourmi.h"
    #include "Plateau.h"
    #include "Etat.h"
    #pragma  once
     
    int Fourmi::get_d()
    {
    	return d;
    }
     
    Fourmi::Fourmi( Plateau& plat )
    {
    	i = (plat.get_h()+1)/2;
    	j = (plat.get_l()+1)/2;
     
    	plat[i][j] = new Fourmi; // <----- Problème
    }
    Voilà le problème est dans le Fourmi.cpp, j'ai pas su comment "insérer' une fourmi dans le plateau.
    Si vous avez besoin des autres .cpp (Etat et Plateau) je vous les envoie en MP, parce que j'ai vraiment peur qu'on me colle un cheater comme ça

    Voici l'explication des mouvements des fourmi:

    TROU : case centrale du quadrillage.
    Changer sa direction = faisant tourner de 90 degrés dans le sens des aiguilles d’une montre.
    La direction est bien dans classe "état" (les cases) et c'est pas la fourmi qui la porte.
    (On suit un cahier de charge pour tout ça)

    La première fourmi sort du trou, trouve une case vide et donc s’installe :
    ← ← ← ← ← ← ←
    ← ← ← ← ← ← ←
    ← ← ← ← ← ←
    ← ← ← ← ← ← ←
    ← ← ← ← ← ← ←
    La seconde fourmi sort du trou, trouve une case occupée donc en change sa direction :
    ← ← ← ← ← ← ←
    ← ← ← ← ← ← ←
    ← ← ← ← ← ←
    ← ← ← ← ← ← ←
    ← ← ← ← ← ← ←
    Elle se déplace alors selon cette direction et rencontre une case vide donc y reste :
    ← ← ← ← ← ← ←
    ← ← ← ← ← ←
    ← ← ← ← ← ←
    ← ← ← ← ← ← ←
    ← ← ← ← ← ← ←
    La troisième fourmi sort du trou, trouve une case occupée donc en change sa direction :
    ← ← ← ← ← ← ←
    ← ← ← ← ← ←
    ← ← ← ← ← ←
    ← ← ← ← ← ← ←
    ← ← ← ← ← ← ←
    Elle se déplace alors selon cette direction et rencontre une case vide donc y reste :
    ← ← ← ← ← ← ←
    ← ← ← ← ← ←
    ← ← ← ← ←
    ← ← ← ← ← ← ←
    ← ← ← ← ← ← ←
    La quatrième fourmi sort du trou, trouve une case occupée donc en change sa direction :
    ← ← ← ← ← ← ←
    ← ← ← ← ← ←
    ← ← ← ← ←
    ← ← ← ← ← ← ←
    ← ← ← ← ← ← ←

    Elle se déplace alors selon cette direction et rencontre une case vide donc y reste :
    ← ← ← ← ← ← ←
    ← ← ← ← ← ←
    ← ← ← ← ←
    ← ← ← ← ← ←
    ← ← ← ← ← ← ←

    Et ainsi de suite...

    Ceci est juste pour vous donner une idée sur le fonctionnement du programme, mon problème c'est l'insertion d'une fourmi dans le plateau (je vous invite à voir mon code en haut)

    Je vous remercie.

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Fourmi::Fourmi( Plateau& plat )
    {
    	i = (plat.get_h()+1)/2;
    	j = (plat.get_l()+1)/2;
     
    	plat[i][j] = new Fourmi; // <----- Problème
    }
    lorsque tu fais cela signifie que tu appelles l'opérateur [] de la classe Plateau, puis encore l'opérateur [] sur l'objet que ce dernier va te renvoyer. C'est ce qu'il se passe lorsque tu fais un tableau à 2 dimensions du type en fait, quand tu vas faire tab[i][j], il va d'abord appeler l'operateur [] qui va te renvoyer un int*, puis encore un fois l'opérateur [] qui va te renvoyer un int.

    Et là, ta classe Plateau ne possède pas d'opérateur [].
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Salut !

    Si ton plateau est une "class" tu devrais soit obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    plat.SetFourmi(i, j) = new Fourmi();
    Ou alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    plat.GetTableau()[i][j] = new Fourmi();
    As tu ton tableau de pointeurs de "Fourmi" ?

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Merci pour votre aide.

    J'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plat.get_case(i,j) = new Fourmi();
    J'ai eu 2 erreurs:
    - Aucun opérateur "=" ne correspond à ces opérandes les types d'opérandes sont Etat = Fourmi *.
    - Aucune instance du constructeur "Fourmi::Fourmi" ne correspond à la liste d'arguments.

    Ma méthode get_case est dans la classe Plateau et est définie comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Etat& Plateau:: get_case(int i, int j)
    {
    return tab[i][j];
    }
    Pour répondre à votre question, non je n'ai pas de tableau de pointeurs de "Fourmi" dans la liste des attributs. La liste d'attributs qu'on nous a demandé d'utiliser dans le cahier de charge est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private:
    	int i,j;
    	int d; // Le nombre de déplacement de la fourmi
    public:
    	Fourmi(Plateau& plat);
    	int get_d();

  5. #5
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    dans Fourmi.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //INCLUDES....
    Fourmi::Fourmi( Plateau& plat )
    {
    	posX = (plat.get_h()+1)/2;
    	posY = (plat.get_l()+1)/2;
     
    	plat.NouvelleFourmi(posX, posY);
    }
    dans Plateau.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //.....
    public:
        //.....
        void NouvelleFourmi(int posX, int posY) { tab[posX][posY].set_o(true); }
    //....
    edit : Que représente ton "d" ? N’hésite pas à écrire le nom entier pour tes variables.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    d correspond au nombre de déplacement de la fourmi.
    J'ai l'habitude de bien nommer les variables mais ici je suis exactement les mêmes variable que celle que le cahier de charge contient.

    Sinon, ta méthode a bien résolu mon problème, je te remercie énormément.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/06/2008, 00h08
  2. Réponses: 5
    Dernier message: 22/04/2008, 11h41
  3. Position d'objet dans un autre objet
    Par Speed41 dans le forum Delphi
    Réponses: 14
    Dernier message: 20/02/2007, 21h51
  4. Réponses: 7
    Dernier message: 10/02/2007, 06h41
  5. Problème d'insertion d'une table dans une autre
    Par capitaine dans le forum Access
    Réponses: 5
    Dernier message: 26/09/2006, 17h44

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