Nel senso capisco perché arriva il segmentation fault, perché cerca degli indici che in realtà non esistono, infatti (credo) che quando entra nella funzione afficher e faccio
- Codice:
size_t i (contenu.size());
la taglia di contenu è "vuota", quindi probabilmente sbaglio qualcosa nel costruttore oppure dopo negli operatori di overloading, ma non trovo l'errore. Qualcuno potrebbe aiutarmi? Grazie anticipatamente.
- Codice:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// Pour simplifier
typedef string Forme ;
typedef string Couleur ;
class Brique
{
private:
Forme forme ;
Couleur couleur ;
public:
/*****************************************************
Compléter le code à partir d'ici
*******************************************************/
Brique(Forme f="", Couleur c="")
: forme(f), couleur(c)
{}
ostream& afficher(ostream& sortie) const{
if( couleur!=""){
sortie << "(" << forme << ", " << couleur << ")" << endl;
}else{
sortie << forme << endl;}
return sortie;
}
};
ostream& operator<<(ostream& out, Brique const& b){
b.afficher(out);
return out ;
}
class Construction
{
friend class Grader;
private:
vector<vector<vector<Brique>>> contenu;
public:
Construction(Brique b)
{
vector<vector<vector<Brique>>> contenu(1,vector<vector<Brique>>(1,vector<Brique>(0)));
contenu[0][0].push_back(b);
}
ostream& afficher(ostream& sortie) const{
size_t i (contenu.size());
for(size_t j(i); j >= 0; j--){
sortie << "Couche numéro : " << j << endl;
for(size_t k(0); k < contenu[j].size(); k++){
for(size_t l(0); l < contenu[j][k].size(); l++){
contenu[j][k][l].afficher(sortie);
} cout << endl; } }
return sortie;
}
vector<vector<vector<Brique>>> getcontenu()const{
return contenu;
}
void operator^=(Construction const& A){
for(size_t i(0); i < A.getcontenu().size(); i++){
contenu.push_back(A.getcontenu()[i]);
}
}
void operator-=(Construction const& A){
if( contenu.size() <= A.getcontenu().size() ){
for(size_t i(0); i < contenu.size(); i++){
for(size_t j(0); j < A.getcontenu()[i].size(); j++){
contenu[i].push_back(A.getcontenu()[i][j]);
} }
}
}
void operator+=(Construction const& A){
if( contenu.size() <= A.getcontenu().size() ){
for(size_t i(0); i < contenu.size(); i++){
if(contenu[i].size() <= A.getcontenu()[i].size()){
for(size_t j(0); j < contenu[i].size(); j++){
for(size_t k(0); k < A.getcontenu()[i][j].size(); k++){
contenu[i][j].push_back(A.getcontenu()[i][j][k]);
} } } }
}
}
};
ostream& operator<<(ostream& out, Construction const& c){
c.afficher(out);
return out ;
}
const Construction operator^(Construction const& A, Construction const& B){
for(size_t i(0); i < B.getcontenu().size(); i++){
A.getcontenu().push_back(A.getcontenu()[i]);
}
return A;
}
const Construction operator-(Construction const& A, Construction const& B){
if( A.getcontenu().size() <= B.getcontenu().size() ){
for(size_t i(0); i < A.getcontenu().size(); i++){
for(size_t j(0); j < B.getcontenu()[i].size(); j++){
A.getcontenu()[i].push_back(A.getcontenu()[i][j]);
} }
}
return A;
}
const Construction operator+(Construction const& A, Construction const& B){
if( A.getcontenu().size() <= B.getcontenu().size() ){
for(size_t i(0); i < A.getcontenu().size(); i++){
if(A.getcontenu()[i].size() <= B.getcontenu()[i].size()){
for(size_t j(0); j < A.getcontenu()[i].size(); j++){
for(size_t k(0); k < B.getcontenu()[i][j].size(); k++){
A.getcontenu()[i][j].push_back(B.getcontenu()[i][j][k]);
} } } }
}
return A;
}
const Construction operator*(unsigned int n, Construction const& a)
{
for(unsigned int i(1); i<=n; i++){
a+a ;
}
return a;
}
const Construction operator/(unsigned int n, Construction const& a)
{
for(unsigned int i(1); i<=n; i++){
a^a ;
}
return a;
}
const Construction operator%(unsigned int n, Construction const& a)
{
for(unsigned int i(1); i<=n; i++){
a-a ;
}
return a;
}
/*******************************************
* Ne rien modifier après cette ligne.
*******************************************/
int main()
{
// Modèles de briques
Brique toitD("obliqueD", "rouge");
Brique toitG("obliqueG", "rouge");
Brique toitM(" pleine ", "rouge");
Brique mur (" pleine ", "blanc");
Brique vide (" ", "");
unsigned int largeur(4);
unsigned int profondeur(3);
unsigned int hauteur(3); // sans le toit
// on construit les murs
Construction maison( hauteur / ( profondeur % (largeur * mur) ) );
// on construit le toit
Construction toit(profondeur % ( toitG + 2*toitM + toitD ));
toit ^= profondeur % (vide + toitG + toitD);
// on pose le toit sur les murs
maison ^= toit;
// on admire notre construction
cout << maison << endl;
return 0;
}
Quando eseguo il programma sul terminale esce
Couche numéro : 0
Segmentation fault (core dumped)
Mentre dovrebbe uscire:
Couche 4 :
(obliqueG, rouge) (obliqueD, rouge)
(obliqueG, rouge) (obliqueD, rouge)
(obliqueG, rouge) (obliqueD, rouge)
Couche 3 :
(obliqueG, rouge) ( pleine , rouge) ( pleine , rouge) (obliqueD, rouge)
(obliqueG, rouge) ( pleine , rouge) ( pleine , rouge) (obliqueD, rouge)
(obliqueG, rouge) ( pleine , rouge) ( pleine , rouge) (obliqueD, rouge)
Couche 2 :
( pleine , blanc) ( pleine , blanc) ( pleine , blanc) ( pleine , blanc)
( pleine , blanc) ( pleine , blanc) ( pleine , blanc) ( pleine , blanc)
( pleine , blanc) ( pleine , blanc)( pleine , blanc) ( pleine , blanc)
Couche 1 :
( pleine , blanc) ( pleine , blanc) ( pleine , blanc) ( pleine , blanc)
( pleine , blanc) ( pleine , blanc) ( pleine , blanc) ( pleine , blanc)
( pleine , blanc) ( pleine , blanc) ( pleine , blanc) ( pleine , blanc)
Couche 0 :
( pleine , blanc) ( pleine , blanc) ( pleine , blanc) ( pleine , blanc)
( pleine , blanc) ( pleine , blanc) ( pleine , blanc) ( pleine , blanc)
( pleine , blanc) ( pleine , blanc) ( pleine , blanc) ( pleine , blanc)