2010-01-20 14 views
2

Je réalise un travail de traitement d'image en C++. Pour cela, j'utilise la bibliothèque CImg.h que je sens bien pour mon travail.Erreur de segmentation lors de l'entrée différente

Voici un petit morceau de code écrit par moi qui lit juste une image et l'affiche.

#include "../CImg.h" 
#include "iostream" 

using namespace std; 
using namespace cimg_library; 

int main(int argc,char**argv) 
{ 
    CImg<unsigned char> img(argv[1]); 
    img.display(); 
    return 0; 
} 

Lorsque je donne à lena.pgm en entrée ce code, il affiche l'image. Où comme si je donnais une autre image, par exemple ddnl.pgm que je présente dans le même répertoire j'obtiens "Segmentation Fault".

Quand je courais le code à l'aide gdb je reçois la sortie comme suit:

Programme signal reçu SIGSEGV, Segmentation fault.
0x009823a3 dans strlen() à partir de /lib/libc.so.6
Absence de debuginfos séparés, utilisez: debuginfo-install glibc-2.9-2.i686 libX11-1.1.4-5.fc10.i386 libXau-1.0.4 -1.fc10.i386 libXdmcp-1.0.2-6.fc10.i386 libgcc-4.3.2-7.i386 libstdC++ - 4.3.2-7.i386 libxcb-1.1.91-5.fc10.i386

Quelqu'un peut-il me dire quel est le problème? et comment le résoudre.

Merci à tous

+1

Il est hautement improbable que cela soit lié à votre problème, mais je pense que "#include " est considéré comme meilleur que "#include" iostream "' – MatrixFrog

+0

Y a-t-il une différence entre les deux images? Est-ce que l'un est significativement plus grand, par exemple? – GManNickG

+1

Ce constructeur CImg qui prend un nom de fichier peut lever une exception (http://bit.ly/6hYyoi). De plus, vous ne vérifiez pas argc alors voyez si argv [1] est même défini. Je ne sais pas si c'est ça, je devine. Avez-vous essayé d'exécuter ceci sous un débogueur comme gdb? Si elle attrape une exception dans gdb, tapez "backtrace" pour voir ce qui s'est passé. – maxpolk

Répondre

1

Segfault vient quand vous essayez d'accéder à memrory que vous n'êtes pas autorisé à accéder. Alors s'il vous plaît vérifier cela dans le code.

+0

Pourquoi la downvote? C'est correct. Je ne suis pas sûr que ce soit pertinent, mais compte tenu de la petite information que nous avons, il pourrait avoir raison. –

1

Le code lui-même semble très bien. Je peux suggérer quelques façons d'aller de l'avant avec le débogage -

  1. Essayez de supprimer l'appel display(). Le problème se produit-il toujours? (Je suppose que c'est le cas).
  2. Essayez de trouver où dans le code CImg est le strlen() qui provoque l'erreur de segmentation (en utilisant un débogueur). Cela peut donner des indices supplémentaires.
  3. S'il s'agit du traitement de fichier PGM, le fichier PGM fourni est peut-être invalide et la bibliothèque ne détecte pas les erreurs. Essayez de l'ouvrir dans un autre visualiseur et de l'enregistrer à nouveau. Si le nouveau fonctionne, comparer les deux peut révéler quelque chose.

Une fois que vous avez plus d'informations, on peut en dire plus.

EDIT -

En regardant les informations supplémentaires que vous avez fourni, et consulter le code lui-même, il semble que CImg échoue en essayant de vérifier quel type de fichier que vous ouvrez.

La ligne correspondante du code est -

if (!cimg::strcmp(ftype,"pnm")) load_pnm(filename); 

Ceci est la première fois « ftype » est utilisé, ce qui me amène à la conclusion qu'il a une valeur non valide.

« ftype » est donné une valeur juste quelques lignes ci-dessus -

const char *const ftype = cimg::file_type(0,filename); 

La fonction file_type() lui-même essaie de deviner quel fichier ouvert, basé sur son en-tête, probablement parce que son ouverture basée sur la extension - a échoué. Il n'y a qu'une seule façon de renvoyer une valeur invalide, ce qui causerait l'échec de strcmp() quand il échoue à identifier le fichier comme quoi il est familier, il renvoie NULL (0, en fait). Donc, je réitère ma suggestion que vous essayez de vérifier qu'il s'agit bien d'un fichier valide. Je ne peux pas vous pointer vers des outils qui sont capables d'ouvrir/enregistrer des fichiers PGM, mais je suppose qu'une simple recherche sur Google serait utile. Essayez d'ouvrir le fichier et ré-enregistrer comme PGM.

+0

salut hexagone, Merci beaucoup pour la réponse ... je vais essayer avec ces suggestions de votre part. Je n'ai pas remarqué la section des commentaires. Pour le prochain post sur je l'utiliserai. Merci. Existe-t-il un moyen de vérifier la validité des fichiers PGM? Je vais google pour n'importe quoi. Si vous le savez, n'hésitez pas à partager. Encore une chose, j'avais utilisé la fonction imwrite de Matlab pour créer ces fichiers PGM. Je ferais confiance à la sortie de Matlab n'importe quand parce que beaucoup de mes algorithmes sont déplacés correctement en utilisant matlab. Je pense qu'il devrait fournir un fichier PGM valide en sortie. – sravan

+0

@sravan, j'ai tendance à être d'accord avec vous - j'aurais aussi fait confiance à Matlab. Mais comme le format PGM n'est pas très strict, il peut y avoir une certaine incompatibilité entre les deux. Et non, je ne suis pas loin d'un bon moyen de vérifier la validité des fichiers PGM. Vous pouvez parcourir le code CImg et voir exactement comment il échoue - il peut vous donner un indice quant à ce qui ne va pas avec le fichier PGM. – Hexagon

+0

hi hexagon, Hier, j'avais téléchargé quelques fichiers pgm sur Internet et essayé le même programme avec ces nouvelles images. Bingo !! Ça a marché. Juste pour me satisfaire j'avais ouvert une image JPG en utilisant GIMP sur Linux et converti en fichier PGM. Même le fichier pgm nouvellement créé pour travailler avec CImg. Par conséquent, je suis arrivé à la conclusion que seules les images PGM créées en utilisant imwrite dans Matlab créaient un problème pour moi. Je ne sais pas si l'erreur imwrite de Matlab génère les mauvais fichiers PGM ou est-ce avec CImg.As je dois poursuivre mon travail j'utilise les fichiers pgm qui ont été téléchargés. Merci hexagone – sravan

0

Une autre cause «amusante à traquer» des erreurs de segmentation est l'incompatibilité des compilateurs entre bibliothèques - ceci est particulièrement répandu lors de l'utilisation de bibliothèques C++.

choses à vérifier sont:

compilez vous
  1. avec le même compilateur a été utilisé pour compiler la bibliothèque CImg?
  2. Utilisez-vous les mêmes indicateurs de compilation?
  3. Des définitions ont-elles été définies lors de la compilation de la bibliothèque que vous ne définissez pas actuellement?

Chacun de ceux-ci m'a mordu de manière subtile auparavant.

+0

En général, ces suggestions sont solides. Mais spécifiquement pour la bibliothèque CImg, il semble qu'elle ne vit que dans un grand fichier d'en-tête (très grand ...). La compilation séparée ne devrait donc pas être un problème - il n'y a rien à lier. – Hexagon

+0

En effet, grattez ces idées pour CImg lui-même. Mais après avoir regardé les documents CImg, il transmet la lecture/écriture de certains formats à d'autres bibliothèques qui pourraient avoir ces problèmes. Cependant, ces bibliothèques sont principalement des librairies C et donc moins sensibles à ce type de problème. –

0

Puisque la plupart d'entre vous demandaient Backtrace of gdb, je pensais que je voudrais poster différemment. Ici, il est:

  1. 0x0076a3a3 dans strlen() de /lib/libc.so.6

  2. 0x0804d127 dans cimg_library :: cimg :: strcmp (s1 = 0x0, s2 = 0x80c0c9f "PNM") à CImg.h: 4972

  3. 0x080c03a7 dans cimg_library :: CImg :: load (= ce 0xbffff324, filename = 0x80c119d "ddnl.pgm") à CImg.h: 29673

  4. 0x08049a93 dans cimg_library :: CImg :: assign() à CImg.h: 10603 CImg() à CImg.h: 10342

  5. main() à temp.cpp: 9

Merci à tous.