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

Langage C++ Discussion :

Problème Multimap insert


Sujet :

Langage 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
    Juin 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2013
    Messages : 2
    Par défaut Problème Multimap insert
    Bonjour à tous,

    Je suis débutant en C++ mais pour les besoins d'un projet je ne peux pas passer au C que je maitrise mieux.

    J'écris un programme qui a pour but de détecter les ellipses. J'ai suivi les consignes d'un document relatant les étapes mais il n'y a pas de base pour l'algo.

    Je dois calculer les paramètres de l'ellipse pour chaque pixel de contour. Ensuite pour chaque valeur de petit axe trouvée, j'incrémente un accumulateur. Ensuite je récupère les paramètres calculés si une valeur de petit axe dépasse un seuil.

    J'utilise un multimap pour sauvegarder les paramètres suivant le centre de l'ellipse que je calcule en premier. Mon problème est lorsque j’exécute le .exe,
    le programme s'arrête après avoir afficher les coordonnées du centre, au moment où j'insere la paire de valeur dans le multimap.

    J'ai vérifie la taille du conteneur, tenté l'insertion avec la fonction emplace mais j'ai toujours le même soucis. Si vous pouviez m'aider car il me reste ça à faire et à regler le problème de la boucle (mais ça c'est autre chose)

    Edit: Je m suis rendu compte que le fichier contient des erreurs que j ai déjà corriger. Milles excuses
    J'ai decommenté les multimaps et remplacé les emplace par des insert et inversé FAIL et SUCCES
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Juste une note rapide concernant C++ par rapport au C, qui pourrait simplifier grandement ton code:

    1. Tu n'as pas besoin de tout declarer des le depart en C++, c'est meme plus efficace (a la relecture, et pour permettre au compilo d'optimiser certains cas) de declarer tes objets seulement au moment ou tu en as besoin.

    2. Ca rejoint le point precedant: evite les declaration d'objets non-initialize autant que possible. Juste en faisant ca tu vas virer plein de potentiel problemes caches.

    3. Tu n'as pas besoin de faire les clear() a la fin de la fonction, c'est appele automatiquement par le destructeur des conteneur. Cherche de la documentation sur RAII pour en savoir plus.

    4. Ne reutilises pas tes noms de variables! Tu complexifie le code pour rien et ca peut facilement cacher des bugs.

    Comme je ne comprends pas exactement ce que tu fais (parceque j'ai jamais fais ca), je ne vais pas commenter sur l'algo...

    Est-ce que tu peu juste m'indiquer la ligne exacte ou ca s'arrete? Parce que c'est pas super clair. Je vois le calcul du centre, mais pas l'insertion.

  3. #3
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    C'est le code commente?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /*if(major.insert(pair<double,Point>(gd_axe,center)) == major.end())
    						cout <<"multimap major "<< SUCCES << endl;
    					else
    						cout <<"multimap major "<< FAIL << endl;*/
    Si oui essaie deja de remplacer pair par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(major.insert(make_pair(gd_axe,center)) == major.end())
    						cout <<"multimap major "<< SUCCES << endl;
    					else
    						cout <<"multimap major "<< FAIL << endl;
    Et aussi, tu as donc C++11 active c'est ca?

    Et enfin: est-ce que le programme s'arrete et ne fais plus rien mais tourne toujours ou est-ce qu'il crash et si c'est le cas est-ce que tu as debugge voir a quelle ligne exactement? Parce que je doute que ce soit a l'insertion.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Déjà, une fonction de 250 lignes, c'est, à peu près, 5 fois trop.

    Sans même être particulièrement rigide quant à la limite du nombre de lignes auquel une fonction devrait se limiter, on peut néanmoins dire que:
    1. chaque fonction ne devrait faire qu'une seule chose, mais devrait la faire correctement.
    2. chaque fonction devrait, pour bien faire, se limiter à 50 lignes de 80 colonnes au maximum
    3. chaque fonction devrait rester la plus simple possible
    Le (1) te permettant, tout à la fois, de corriger tes fonctions facilement tout en facilitant la réutilisation

    Le (2) est une sorte de limite "historique": à l'époque, les écrans étaient composés de 25 lignes par 80 colonnes.

    Une fonction devrait pouvoir être lue entièrement sur l'équivalent de l'affichage de deux écrans complets au maximum.

    Au delà, les fonctions deviennent trop difficiles à lire et à suivre.

    Pour le (3) enfin, il faut savoir que, tant qu'une fonction fait ce qu'on attend de sa part, on ne peut pas considérer la solution qu'elle met en oeuvre comme "mauvaise".

    Seulement, certaines solutions sont plus efficaces que d'autres. Et la solution la plus efficace est souvent la plus simple

    Ainsi, ta fonction main pourrait être, sans aucune difficulté, divisée en au moins quatre étapes:
    1. chargement et affichage de l'image d'origine
    2. détection des éclipses
    3. vérification des accumulateurs
    4. affichage final
    Notes au passage qu'il n'est pas forcément nécessaire d'appeler clear() sur tes map/multimap, parce que ces classes respectent le principe du RAII (enfin, du pendant du RAII au moment de la destruction: tout le contenu est détruit de manière correcte).

    Enfin, il faut savoir que, contrairement à C (qui permet, dans les anciennes normes en tout cas, de ne déclarer des variables qu'au début d'une fonction), tu peux déclarer une variable n'importe où. Tu as donc largement intérêt à ne déclarer tes variables que le plus près possible de leur utilisation, et, tant qu'à faire, tu devrait essayer de donner des noms clairement explicites, qui te permettront de déterminer sans doute possible le but de tes variables dans trois ou dans six mois, lorsque tu auras eu l'occasion d'oublier ton code (et, accessoirement, qui permettront au lecteur de ton code qui interviendra sur le forum de le comprendre sans avoir à se poser la question de "mais qu'est-ce qu'il a voulu dire???")

    En effet, il n'est pas plus difficile d'appeler une variable accumulateur (ou accumulator) que de l'appeler acc, d'autant plus que tu as le système de complétion automatique derrière toi.

    Mais cela facilite énormément la lecture (et rend, en outre, les commentaires comme "creation d'un accumulateur à 1 dimmension" purement inutile)

    De même, tu déclares it à la ligne 61 et it2 à la ligne 73, pour ne les utiliser qu'à partir de la ligne... 206, qui correspond, justement, au début de l'une des "grandes étapes" que j'ai déterminé plus haut

    Avant même d'essayer de voir quel est réellement le problème, je te proposerais volontiers de corriger tout cela, afin que ton code soit plus facilement compréhensible.

    N'oublie en effet jamais qu'un code (surtout s'il est destiné à être présenté sur un forum, mais même sans cela) sera toujours beaucoup plus souvent lu / analysé/ modifié qu'il ne sera écrit / compilé.

    Plus ton code est facile à lire et à comprendre, plus il devient facile à modifier en évitant les chausses trappes éventuelles, et plus il devient facile à corriger
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2013
    Messages : 2
    Par défaut
    Merci pour vos conseils, j'en prends compte.

    Donc j'ai remplacé : major.insert(pair<double, Point>(gd_axe, center))

    par : major.insert(pair<double, Point>(gd_axe, center))

    Il n'y a rien de changer. Le programme s'arrête après le calcul du centre de l’ellipse. Toutefois il y a une fenêtre pour le débogage qui s'ouvre. Alors après avoir utiliser le débugger de MVS 2010 il me retourne:

    Exception non gérée à 0x008a5e1c dans cpp-example-hougcircles.exe : 0xC0000094 : Interger division by zero.

    Donc ça n'arrive pas au niveau du multimap. Ça se passe lors du calcul de la variable alpha. Donc je vérifie tout ça...

    EDIT : La manière que j'utilisais pour choisir un point dans le vecteur pixel selon une distance n'était pas bonne. En fait je me retrouvait avec 2 point avec la même abscisse x.

Discussions similaires

  1. Problème d'insertion dans une multimap
    Par Haric0t dans le forum C++
    Réponses: 8
    Dernier message: 23/11/2012, 19h49
  2. Probléme d'insertion par défault
    Par xavier62 dans le forum SQL
    Réponses: 7
    Dernier message: 28/11/2003, 13h03
  3. [Interbase 7] Problème d'insertion de données
    Par Tuscelan dans le forum InterBase
    Réponses: 12
    Dernier message: 19/11/2003, 22h58
  4. STL : std::set problème avec insert ...
    Par Big K. dans le forum MFC
    Réponses: 13
    Dernier message: 08/11/2003, 01h02
  5. Problème d'insertion avec MySQL
    Par Sonny dans le forum ASP
    Réponses: 13
    Dernier message: 28/08/2003, 13h52

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