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 :

Problème d'allocation mémoire C++ / OpenCV


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Par défaut Problème d'allocation mémoire C++ / OpenCV
    Bonjour

    j'ai cherché à résoudre mon problème toute la nuit et je ne trouve pas de solution; Voici le message d'erreur :

    "Erreur de segmentation (core dumped)"

    Voici la fonction qui fait bugger à l'execution.
    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
     
    Mat BlurringFBA (Mat vfft)
    {
    int i=0, j=0;
    int n = vfft.rows;
    int m = vfft.cols;
    Mat win(n, m, CV_32FC1);
    Mat wout(n, m, CV_32FC1);
     
    for (i=0;i<n;i++)
    	for (j=0; j<m; j++)
    		{
    			Vec3b v = vfft.at<Vec3b>(i,j);
    			v[0] =1/3*( fabs(v[0]) + fabs(v[1]) + fabs(v[2])) ; 
    			win.at<double>(i,j)=v[0];
    		}  
    double var = min(m,n)/50;
    GaussianBlur(win, wout, Size(3,3) , var, var);  
    return wout;	
    }
    cette fonction est appelée plusieurs fois dans le main() mais à l’exécution, elle s'appelle une fois et plante ensuite, avant même d’être rappelée, pour preuve, malgré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Mat w1 = BlurringFBA (vfft1);
    cout<<"hello"<<endl;
    Mat w2 = BlurringFBA (vfft2);
    l'affichage de "hello" ne se fait pas sur le terminal.

    Quelqu'un peut-il m'expliquer comment éviter ce genre de plantage et me donner une solution dans ce cas précis ?

    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut
    Salut,

    Pour déboguer, l'affichage de message n'est pas du tout recommandé. Surtout pour une erreur de segmentation.

    Connais-tu un débogueur? (GDB ou autre).

    Sinon, je suppose que ton erreur vient d'ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double var = min(m,n)/50;
    Ta variable doit sans doute toujours être initialisée à 0: tu divises 2 entiers.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Par défaut
    Bonjour

    Merci pour votre réponse.

    Le debugger GDB me renvoie ceci après le bt :

    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
     
    #0  0x00007ffff6a1fcc9 in __GI_raise (sig=sig@entry=6)
        at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
    #1  0x00007ffff6a230d8 in __GI_abort () at abort.c:89
    #2  0x00007ffff7024535 in __gnu_cxx::__verbose_terminate_handler() ()
       from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #3  0x00007ffff70226d6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #4  0x00007ffff7022703 in std::terminate() ()
       from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #5  0x00007ffff7022922 in __cxa_throw ()
       from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #6  0x00007ffff70741a7 in std::__throw_logic_error(char const*) ()
       from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #7  0x00007ffff707f9b1 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) ()
       from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #8  0x00007ffff707fd48 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) ()
       from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #9  0x0000000000401832 in main (argc=1, argv=0x7fffffffdfb8) at Main.cpp:75
    j'ai modifié mon code en écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double var = min(double(m), double(n))/50;
    Mais l'erreur persiste...
    et je n'ai pas le bagage info pour interpréter le diagnostique du GDB...

    Merci

  4. #4
    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
    Vu que l'erreur provient de la ligne 75 de Main.cpp sur la construction d'une std::string, j'ai des doutes que double var = min(double(m), double(n))/50; soit impliqué.
    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.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Par défaut
    La ligne 75 correspond au début du main(). Ce sont des importations d'images couleur qui semble parfaitement fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Mat vtild1 = imread(argv[1], CV_LOAD_IMAGE_COLOR);
    Que signifient les autres lignes du diagnostique ?

    Merci

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut
    Vérifies-tu que argv[1] existe? (avec argc). C'est tout bête mais quand on débute, on a très souvent ce genre d'erreur.

Discussions similaires

  1. Problème d'allocation mémoire
    Par Fibus dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 10/01/2008, 16h35
  2. Problème d'allocation mémoire
    Par elmayor1983 dans le forum C++
    Réponses: 5
    Dernier message: 14/02/2007, 10h08
  3. Problème d'allocation mémoire et fork
    Par Conap dans le forum Langage
    Réponses: 3
    Dernier message: 20/07/2006, 15h34
  4. Problème d'allocation mémoire
    Par araya dans le forum C
    Réponses: 2
    Dernier message: 04/05/2006, 20h03
  5. Problème d'allocation mémoire
    Par cali1983 dans le forum C++
    Réponses: 10
    Dernier message: 10/03/2006, 23h23

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