IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Stocker une image PGM dans une matrice


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Par défaut Stocker une image PGM dans une matrice
    Bonjour, je veux lire une image PGM (P3 ou P5) et stocker les composantes de gris de chaque pixels dans une matrice (qui est assimilée à un tableau à 2 dimensions).
    J'ai une classe matrice qui crée un tableau dynamique de la taille de l'image (largeur et hauteur en pixel), voici ma classe (enfin juste le début):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Matrice{
    private:
       unsigned int taille_x; //Width
       unsigned int taille_y; //Height
       unsigned int **tableau; //Matrix
    Je crée donc une instance de la classe avec la largeur et la hauteur de l'image et le tableau est vide, tout va bien. Ensuite j'utilise ma fonction pour lire le PGM:

    Cette fonction prend le nom du fichier en paramètre, elle lit d'abord le magic number (p5 ou p3), puis les dimensions de l'image, ensuile la valeur max pour un pixel (255 niveau de gris) et enfin je lis le reste du fichier et je remplis le tableau avec les valeurs de gris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    void Matrice::lirePGM(std::string filename){
       std::ifstream file(filename.c_str(), std::ios::binary);
       unsigned int w, h, g;
       char extension[2];
       file >> extension;
       if(extension[0] == 'P' && (extension[1]=='5' || extension[1]=='3'))
       {
           skip_line(file);
           skip_comments(file);
           file>>w>>h;
           skip_line(file);
           skip_comments(file);
           file>>g;
           if(g!=255) std::cout << "Error grayscale" << std::endl;
           skip_line(file);
           skip_comments(file);
       }
       else{
           w = h = 0;
           std::cerr << "Error PGM magic number" << std::endl;
       }
       file.read((char*)this->tableau, this->getY()*this->getX()); //Partie pour lire le reste du fichier et le stocker
       file.close();
    }
    Les dimensions, le magic number ainsi que la valeur max de gris marche bien mais il semblerait que la partie pour lire les pixels ne marche pas. Quand je veux afficher mon tableau il est vide et j'ai une erreur "Erreur de segmentation (core dumped)".

    Je précise que j'ai testé ma fonction d'affichage sur une autre matrice (avec des valeurs aléatoires dans la matrice), elle marche bien.

    Voici un screen du début de mon fichier PGM:
    https://i.gyazo.com/5d4291597cd1d024...28813c9db9.png

    Du coup je vois pas ce qui ne marche pas, surement dans ma lecture

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    recherche le new unsigned int[w][h] (*) et tu auras ta réponse


    Édit : Je n'ai pas vérifié , trop de C, et apparemment cette écriture n'est pas permise. Celle ci est correcte new unsigned int[w * h]

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Par défaut
    J'ai pas compris ce que tu veux dire

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Digression : les pointeurs nus c'est caca, alors, comment dire, "unsigned int **" ça sent pas la rose.

    @foetus te demandes, indirectement, de nous prouvez que toutes les cases mémoires dont le contenu qui va être écraser par "file.read((char*)this->tableau, this->getY()*this->getX())" ont bien été réservées pour cet usage (de barbare).

    "new unsigned int[w][h]" est une manière (toute moisie) de réserver ces cases mémoires.

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Par défaut
    @bacelar donc si par exemple je te dit que j'ai réussi à le remplir avec des nombres aléatoires sans erreur (et donc 100 nombres pour une matrice 10*10) ca suffit à prouver que toutes les cases sont allouées ?

    Tu connais une méthode moins moisie de les réserver ?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Il me semble surtout que new unsigned int [w][h] est très faux et ne crash pas uniquement parce que par hasard h < w
    Et pour une image à fortiori on fera une allocation à plat de w*h et pas un tableau multidimensionnel
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    @bacelar donc si par exemple je te dit que j'ai réussi à le remplir avec des nombres aléatoires sans erreur (et donc 100 nombres pour une matrice 10*10) ca suffit à prouver que toutes les cases sont allouées ?
    NON, cela ne prouve rien.
    T'as juste modifié la valeur de 10*10*sizeof(char) cases mémoires dans une zone où les flags de protection des pages mémoires autorisent l'écriture, ce qui est le cas de n'importe quel page mémoire mappée, que cela soit du code, la stack, le tas de la RuntimeC, etc...
    Donc la probabilité de réussite, même avec une valeur dans "tableau" complètement aléatoire ne sont pas négligeable, très loin de là.
    Cela ne prouve que tu maitrises vraiment très mal la notion de gestion mémoire en C++, et même en C (vue ton affection maladive pour les pointeurs nus).

    Tu connais une méthode moins moisie de les réserver ?
    WTF ?
    Bin, nos remarques, c'est sur le fait que tu ne montres en rien la manière donc tu réserves la mémoire.
    Et comme on connait bien les peaux de banane des pointeurs nus, on fait l'assertion que t'as suivis des cours de C (le ++ dans le titre, c'est pour appâter le chaland) et que t'as cru qu'en C++, c'est comme dans le C des années 1970.

    Tu t'es pris un "Erreur de segmentation (core dumped)" parce que tu gères la mémoire comme une nouille et tu nous montres pas comment tu la gères, cette mémoire.

    Donc comment tu réserves la mémoire que tu écrabouilles avec fread ?

    T'inquiètes pas, des manières robustes et simple de gérer la mémoire en C++, c'est pas cela qui manque, mais c'est fonction de comment tu comptes te servir de la mémoire après.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Kalemiro Voir le message
    @bacelar donc si par exemple je te dit que j'ai réussi à le remplir avec des nombres aléatoires sans erreur (et donc 100 nombres pour une matrice 10*10) ca suffit à prouver que toutes les cases sont allouées ?
    int toto[100]; et voilà j'ai un tableau de 100 nombres aléatoires sans erreur

    Matrice(unsigned int& _taille_x, unsigned int& _taille_y) c'est quoi ces références ?!
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  2. Réponses: 0
    Dernier message: 07/06/2009, 12h31
  3. Réponses: 4
    Dernier message: 19/06/2008, 15h41
  4. position dans une image (selection dans une image)
    Par kaiseresis dans le forum Images
    Réponses: 3
    Dernier message: 31/05/2008, 13h30
  5. Enregistrer une image bmp dans une matrice
    Par Mounr dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/04/2007, 23h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo