Cherche a definir tableau bidimensionel de booleens.

Fermé
feraudyh Messages postés 70 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 3 mars 2023 - 2 juil. 2014 à 19:00
feraudyh Messages postés 70 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 3 mars 2023 - 2 juil. 2014 à 22:37
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:
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:

TableBool2D tab2D(10,20);
tab2D.setBit(5,6,true);
std::cout <<tab2D.getBit(5,6);
alors une tentative de tracer plante avant meme d'entrer dans le code
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:

5 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
2 juil. 2014 à 20:29
'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
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_ptr
mais 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;
}
1
feraudyh Messages postés 70 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 3 mars 2023 6
2 juil. 2014 à 20:06
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);

par
Map = new std::vector< std::vector<bool> * >;
for (int i = 0; i < hauteur; i++)
Map->push_back(new std::vector<bool>(largeur, false));
Est ce que vous trouvez que c'est plus propre?
0
feraudyh Messages postés 70 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 3 mars 2023 6
Modifié par feraudyh le 2/07/2014 à 20:27
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é!!
0
feraudyh Messages postés 70 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 3 mars 2023 6
2 juil. 2014 à 21:43
Merci pour cette réponse généreuse.

Le tableau de bool est il économe en place?
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
2 juil. 2014 à 22:13
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
feraudyh Messages postés 70 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 3 mars 2023 6
2 juil. 2014 à 22:37
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];
}
0