Cherche a definir tableau bidimensionel de booleens.
feraudyh
Messages postés
70
Date d'inscription
Statut
Membre
Dernière intervention
-
feraudyh Messages postés 70 Date d'inscription Statut Membre Dernière intervention -
feraudyh Messages postés 70 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je cherche a definir un tableau bidimensionel de booléens avec la STL.
Je me définis une classe dont le membre privé principal est défini comme suit:
std::vector< std::vector<bool> *> >*Map;
J'ajoute deux champs de dimensions.
La définition de la classe est la suivante:
les fonctions sont définies comme ci:
Malheureusement il y a des problemes:
sous Qt si mon main contient ceci:
mais si j'execute sans débogueur je n'ai pas de probleme.
Cela dit je ne suis pas sûr de mon code, en particulier le constructeur est il valable?
Je cherche a definir un tableau bidimensionel de booléens avec la STL.
Je me définis une classe dont le membre privé principal est défini comme suit:
std::vector< std::vector<bool> *> >*Map;
J'ajoute deux champs de dimensions.
La définition de la classe est la suivante:
class TableBool2D
{
int m_hauteur;
int m_largeur;
std::vector< std::vector<bool> * > *Map;
public:
TableBool2D(int hauteur, int largeur);
void setBit(int nb_ligne, int nb_colonne, bool bit);
bool getBit(int nb_ligne, int nb_colonne);
};
les fonctions sont définies comme ci:
TableBool2D::TableBool2D(int hauteur, int largeur)
{
Map = new std::vector< std::vector<bool> * >(hauteur, nullptr);
for(int i = 0; i < hauteur; i++)
Map->at(i) = new std::vector<bool>(largeur,false);
m_hauteur = hauteur;
m_largeur = largeur;
}
void TableBool2D::setBit(int nb_ligne, int nb_colonne, bool bit)
{
std::vector<bool>*ligne = Map->at(nb_ligne) ;
ligne->at(nb_colonne) = bit;
}
bool TableBool2D::getBit(int nb_ligne, int nb_colonne)
{
std::vector<bool>*ligne = Map->at(nb_ligne) ;
return ligne->at(nb_colonne);
}
Malheureusement il y a des problemes:
sous Qt si mon main contient ceci:
alors une tentative de tracer plante avant meme d'entrer dans le code
TableBool2D tab2D(10,20);
tab2D.setBit(5,6,true);
std::cout <<tab2D.getBit(5,6);
mais si j'execute sans débogueur je n'ai pas de probleme.
Cela dit je ne suis pas sûr de mon code, en particulier le constructeur est il valable?
A voir également:
- Cherche a definir tableau bidimensionel de booleens.
- Tableau word - Guide
- Tableau ascii - Guide
- Trier un tableau excel - Guide
- Tableau croisé dynamique - Guide
- Définir google comme page d'accueil - Guide
5 réponses
'lut, pour ta "mise a jour" de code, c'est pas plus spécialement plus propre vu que tu as précisé dans ton premier constructeur de vector la taille qu'il doit avoir...
Utiliser des vector est une idée, mais un vecteur de pointeurs n'en est pas une bonne: il faut alors gérer à la main la désallocation de chaque élément. Soit, comme tu utilises du C++11, tu te sers de
D'ailleurs, si tu ne prévois pas de pouvoir redimensionner ton tableau 2D, considère l'utilisation d'un seul et unique vecteur, voire si tu souhaites/peut faire de la gestion mémoire manuelle, d'un
Autre chose: utilise les initialiseurs dans ton constructeur:
Utiliser des vector est une idée, mais un vecteur de pointeurs n'en est pas une bonne: il faut alors gérer à la main la désallocation de chaque élément. Soit, comme tu utilises du C++11, tu te sers de
std::unique_pointer<std::vector<bool>>, soit tu transformes ton vecteur en
std::vector<std::vector<bool>>"simple" auquel cas ton initialisation se fait juste avec
Map = new std::vector<std::vector<bool>>(hauteur, vector<bool>(largeur, false));.
D'ailleurs, si tu ne prévois pas de pouvoir redimensionner ton tableau 2D, considère l'utilisation d'un seul et unique vecteur, voire si tu souhaites/peut faire de la gestion mémoire manuelle, d'un
Map = new bool[hauteur*largeur]en constructeur et
delete[] Map;en destructeur (c'est aussi possible avec un
std::unique_ptrmais il faut préciser un destructeur pour ton tableau), puis pour accéder à l'élément (x, y), tu fais
x+y*m_largeur.
Autre chose: utilise les initialiseurs dans ton constructeur:
TableBool2D::TableBool2D(int hauteur, int largeur) : m_hauteur(hauteur), m_largeur(largeur) { ... // Du coup, on vire ces lignes: //m_hauteur = hauteur; //m_largeur = largeur; }
J'ai remplacé les lignes
par
Map = new std::vector< std::vector<bool> * >(hauteur, nullptr);
for(int i = 0; i < hauteur; i++)
Map->at(i) = new std::vector<bool>(largeur,false);
par
Map = new std::vector< std::vector<bool> * >;Est ce que vous trouvez que c'est plus propre?
for (int i = 0; i < hauteur; i++)
Map->push_back(new std::vector<bool>(largeur, false));
Il semble maintenant que le crash lors de l'execution n'a eu rien à voir avec le programme même. Mais jai bien eu une ligne dans un fichier .h où une exception de violation d'acces aurait eu lieu.
Je suis sorti de QtCreator et je suis retourné et l'exception n'a plus eu lieu. J'ai l'impression que Qt 5.3.1 est assez buggé!!
Je suis sorti de QtCreator et je suis retourné et l'exception n'a plus eu lieu. J'ai l'impression que Qt 5.3.1 est assez buggé!!
Merci pour cette réponse généreuse.
Le tableau de bool est il économe en place?
Le tableau de bool est il économe en place?
Un vrai tableau de bool non, car un bool occupe un octet en mémoire. Le standard C++11 précise par contre une spécialisation pour les
vector<bool>(§23.3.7 de l'ISO/IEC 14882:2011) où les booléens sont stockés dans un bitfield, c-à-d que 8 bools dans le vecteur ne prendront qu'un octet de mémoire (car 1octet=8bits), divisant effectivement l'espace requis par 8.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question