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 :

Enlever une valeur d'un vecteur de double


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Février 2013
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 94
    Par défaut Enlever une valeur d'un vecteur de double
    Bonjour à toutes et à tous,

    C'est une question sans doute triviale, mais je ne trouve pas d'autre sujet répondant à cette question dans le forum. Il s'agit tout simplement de supprimer une valeur particulière 'joker' d'un tableau de double et de connaitre le nombre de ces valeurs supprimées, défini par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double * L_positions;
    L_positions  = (double *) realloc(L_positions, n * sizeof(double));
    ou 'n' est la taille de mon tableau. Ce tableau n'est pas encore rempli en entier, et je connais exactement le nombre de valeurs contenues dans ce tableau (par une seconde variable 'size').
    Donc je souhaite, parmi ces valeurs 'size', supprimer toutes les valeurs 'joker'. C'est très classique, nous sommes d'accord! Sur Google -mon ami- je trouve pas mal d'exemples documentés de la fonction std::remove() qui me conviendrait parfaitement, mais ca ne fonctionne pas dans mon cas, je me trompe donc quelque part:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double* pend = L_positions+n;
    L_positions = std::remove(L_positions, pend, joker);
    ou 'pend' est la taille du tableau. Mais: Ca ne fonctionne pas (core dump bien que la compilation marche), je parcours TOUT le vecteur (ce qui est plus couteux en temps que de juste regarder sur les premiers 'size') et de plus je ne connais pas le nombre de valeurs supprimées (il faudrait un sizeof() j'imagine?).

    Merci par avance,

    Bien à vous lire!

  2. #2
    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 : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    std::remove retourne un itérateur sur la fin de la collection après avoir enlevé les valeurs trouvées, soit sur la première valeur enlevée.
    Si j'ai [1, 2, 3, 4, 5] et std::remove(3), j'aurais [1, 2, 4, 5, 3] et le retour sera l'itérateur sur 3.

    Ps: std::vector ?
    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.

  3. #3
    Membre confirmé
    Inscrit en
    Février 2013
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 94
    Par défaut
    Ouah, merci pour ce retour rapide!
    Je n'avais effectivement pas vu que ca retourne un iterator sur la fin du vecteur trié (avant les exclusions). Du coup je dois pouvoir en déduire le nombre de valeurs enlevées, et ca c'est chouette.
    Par contre je parcours tout le tableau, c'est couteux car le tableau est grand. Je vais m'en accommoder dans un premier temps.

    Quelle est l'explication sur le plantage du programme? Je connais bien le nombre de valeurs de mon tableau je ne saisis pas pourquoi ca ne fonctionne pas. Ca me semble cohérent avec l'exemple mentionné sur http://www.cplusplus.com/reference/algorithm/remove/ mais je rate quelque chose.

    PS: Effectivement std::vector très prochainement, j'essaie déjà de comprendre pourquoi ca ne marche pas.

  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 : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Oui il faut obligatoirement parcourir tout le tableau, je vois pas bien quelle autre solution tu aurais ?
    Le crash vient sûrement d'un accès à un pointeur pourri.
    Avec ces 3 lignes il n'y a rien de suspicieux à priori.
    - d'où vient n ?
    - es-tu sûr que le realloc a fonctionné ?
    - n est-il modifié à un moment ?
    Le debugger t'en dira plus. Et std::vector aiderait aussi à en savoir plus, voire à supprimer le bug complètement (begin, end, size, tous ces trucs sont maîtrisés).
    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
    Membre confirmé
    Inscrit en
    Février 2013
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 94
    Par défaut
    Ok, merci pour ce les pistes je vais creuser.
    Je suis sur que le realloc a bien fonctionné (je liste les valeurs de mon tableau, j'ai vérifié sa taille 'n' avant et c'est propre).
    Sur, std::Vector est top, je vais basculer dessous prochainement, je confirme déjà les calculs avant de modifier plus à fond le programme.
    Merci!

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    realloc en C++, il faut oser!

    La fonction remove() consiste à déplacer à la fin d'une collection les éléments à supprimer, la valeur de retour n'est certainement pas ce qu'il faut conserver!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double *byebye = std::remove(L_positions,  L_positions+n, joker); // réarranger et indiquer ce qui est mort
    n = byebye  -  L_positions; // la nouvelle valeur de n et l_positions est forcément inchangé!
    Encore une fois, realloc en C++, il faut oser! Et passe très très vite aux std::vector<>

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/11/2008, 16h37
  2. Enlever une valeur par défaut dans une txtBox
    Par moilou2 dans le forum IHM
    Réponses: 8
    Dernier message: 09/10/2008, 12h17
  3. Enlever une valeur dans une zone de liste
    Par léti07 dans le forum Access
    Réponses: 20
    Dernier message: 23/09/2006, 06h19
  4. Insérer une valeur dans un vecteur
    Par jalilv6 dans le forum Langage
    Réponses: 2
    Dernier message: 07/04/2006, 07h04
  5. Supprimer une valeur dans un vecteur
    Par jalilv6 dans le forum Langage
    Réponses: 2
    Dernier message: 06/04/2006, 09h33

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