Seg fault avec un template

Signaler
-
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
-
Bonjour à tous, j'espere trouver de l'aide ici :)

Voila mon probleme :

Je dois programmer un "photoshop" pour image du type "ppm" pour la fac, voila commnet je m'y suis pris :


1) une classe "base" (en fait c'est une matrice)
2) un template "image" qui n'est qu'un tableau de base (un matrice en 3D du coup, pour pouvoir représenter de 1 (si c'est une image noir/blanc) à 3 (pour RGB) "couleurs)).

A priori, ca peut venir de mes operator[] ou de mes allocs :x

main.cpp
#include "image.hpp"
#include "base.hpp"
#include <cstdlib>
#include 
#include <ctime>
#include <cmath>
#include <fstream>
#include <string>
 
int main()
{
const string load = "./zozo.ppm";
const string save = "./test2.ppm";
 
image<3> a(load);
//a.save(save);
 
return 0;
}


base.cpp
base::base(int lin, int col)
{
l=lin;
c=col;
 
matrice = new int*[lin];
 
for(int i=0; i<lin; i++)
{
matrice[i] = new int[col];
for(int j=0; j<col; j++)
matrice[i][j] = 0;
}
}
 
base::~base()
{
for(int i=0; i<l; i++)
delete [] matrice[i];
 
delete[] matrice;
}
 
 
int* base::operator[](int i)
{
return matrice[i];
}


mon template image.hpp
#include 
#include "base.hpp"
#include <cstdlib>
#include 
#include 
#include <string>
#include <fstream>
 
using namespace std;
 
template 
class image
{
int line;
int col;
int dimension;
string p;
int nb_color;
 
base* img[N];	
 
public:
image(string);
                ~image();
base& operator[](int);
};
 
template 
image<N>::image(string path)
{
ifstream fichier;
fichier.open(path.c_str());
 
if(fichier)
{
getline(fichier, p);
 
fichier >> col;
fichier >> line;
dimension = N;
 
if( ! (p "P1" || p "P4"))
fichier >> nb_color;
else
nb_color = 2;
 
int i, j, k;	
 
for(i=0; i<N; i++)
img[i] = new base(line, col);
 
cout << p << endl << line << endl << col << endl << dimension << endl;
 
for(j=0; j<line; j++)
{
for(k=0; k<col; k++)
{
for(i=0; i<N; i++)
{
fichier >> *this[i][j][k];
}
}
}
 
fichier.close();		
}
}
 
template 
image<N>::~image()
{delete[] img;}
 
 
template 
base& image<N>::operator[](int i)
{
return *(img[i]);
}


Merci d'avance

1 réponse

Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
Bonjour.

C'est tout simplement que:
1) Si le fichier n'existe pas, tu n'initialises pas ton tableau image, alors que tu essaies toujours de le libérer.
3) Tu libères mal celui-ci.

Ajoute au début de image::image():
  for(int i=0; i<N; i++)
    img[i] = 0;


Dans le destructeur image::~image(), il faut mettre:
  for(int i=0; i<N; i++)
    delete img[i];

En effet, on libère pas une zone "statique". delete[] va avec un new[] et non avec un tab[TAILLE_FIXE].

Quelques conseils:
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Ne prédéclare rien, écris la variable au moment de l'utilisation (voir mes "for" par rapport au tiens)
- assert.h => cassert
- Utilise std::vector au lieu de faire des array à l'ancienne !
- Si les dimensions sont fixes, alors utilise un seul tableau de taille N * N, auquel tu accès à [x][y] en faisant [x + y * taille], exemple: https://github.com/cptpingu/game/blob/master/src/Core/Array2D.hh (d'autre petit outils sont présents, n'hésite pas à les regarder).
- Pas besoin de fichier.close(), un fichier de type fstream se ferme tout seul .
- N'hésite pas à poster tes avancées, si tu veux une critique constructive de ton code.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question