Cherche a definir tableau bidimensionel de booleens.
feraudyh
Messages postés
78
Statut
Membre
-
feraudyh Messages postés 78 Statut Membre -
feraudyh Messages postés 78 Statut Membre -
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?
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 destd::unique_pointer<std::vector<bool>>
, soit tu transformes ton vecteur enstd::vector<std::vector<bool>>
"simple" auquel cas ton initialisation se fait juste avecMap = 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'unMap = new bool[hauteur*largeur]
en constructeur etdelete[] Map;
en destructeur (c'est aussi possible avec unstd::unique_ptr
mais il faut préciser un destructeur pour ton tableau), puis pour accéder à l'élément (x, y), tu faisx+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
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);
parMap = 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é!! -
Merci pour cette réponse généreuse.
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 -
Oui, merci, je vais implementer tout cela comme un vector<bool> et gerer mes propres indexes avec la formule
bool getBit(int X,int Y)
{
return monvecteurbool[width*Y + X];
}