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 tri de données C++


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut Problème tri de données C++
    Salut à tous, j'ai un petit souci dans mon programme et je ne vois pas trop d'où cela peut provenir.
    En fait, ce que fait mon programme est de regarder quelle est la composante d'un vecteur la plus proche d'une composante d'un autre vecteur.
    Une fois que j'ai trouvé cette composante la plus proche, je l'insère dans un nouveau vecteur. Et ainsi de suite pour toutes les composantes du dit vecteur.
    Voici la tête de mon programme sachant que je travaille sur Code Blocks:

    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
    // Traitement des données : recalage du vecteur temps des déformations sur le vecteur temps de la force
            int t(1);
            double def[resultf.size()];
            double tdef[resultf.size()];
            def[0] = 0;
            tdef[0] = 0;
            for (int i=1;i<resultf.size();i++)
            {
                while ((td[t] - resultf[i][0])<0) t++;
                    if (fabs(td[t]-resultf[i][0]) < fabs(td[t-1]-resultf[i][0]))
                    {
                        def[i] = resultd[t][7];
                        tdef[i] = td[t];
                    }
                    else
                    {
                        def[i] = resultd[t-1][7];
                        tdef[i] = td[t-1];
                    }
            }
    Le problème, c'est que quand je compile il n'y a pas d'erreur mais le programme plante quand je l'exécute.
    Et quand je met en commentaire le "else" du "if", ça marche or j'ai absolument besoin du "else".
    Voilà, j'espère que j'ai été clair.
    Merci d'avance pour votre aide.
    Images attachées Images attachées  

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Si "le programme plante", c'est qu'il y a un problème que le compilateur n'a pas détecté dans ton code. Mais cela ne veut pas dire que le compilateur n'aurait pas pu le détecter. En activant les options de compilation adéquates (-Wall -pedantic -Wextra), tu aurais peut être pu avoir un avertissement de la part de celui-ci. Et, si tu avais pris cet avertissement en compte afin d'essayer de le supprimer, ton programme n'aurait peut être pas "planté".

    L'avantage, c'est que tu nous as donné une piste : tout semble se passer dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    else
    {
        def[i] = resultd[t-1][7];
        tdef[i] = td[t-1];
    }
    Malheureusement, nous n'avons aucune idée de ce à quoi peuvent bien correspondre reusltd et td, ce qui ne nous facilite pas vraiment la tâche.

    Cependant, à voir l'utilisation que tu en fais, il semblerait que resultd soit un tableau à deux dimensions (est-ce le cas pour td mystère). Je serait très intéressé par le fait de savoir comment tu définis ce tableau. Ma boule de crystal me dit que le problème a de fortes chances de venir de là

    Ceci dit, as-tu pensé à la possibilité de "lineariser" ton tableau 2D
    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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Merci pour ta réponse.
    En mode debug, il me dit : "segmentation fault".
    Voici l'intégralité du code:

    Nom : code_2.png
Affichages : 196
Taille : 41,5 Ko

    Je te préviens, c'est pas du joli C++...

  4. #4
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Citation Envoyé par js_naka Voir le message
    Je te préviens, c'est pas du joli C++...
    On à vu pire.

    Met ton code directement (copié/collé dans des balises [ code]) plutôt qu'un screen.
    J'y jetterai bien un oeil, mais retaper le code pour voir ou ça bloque, que le debugger me dise ou ça bloque, c'est relou.

    Si on peut avoir une idée des fichiers d'entrée aussi;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double def[resultf.size()];
    double tdef[resultf.size()];
    C'est illégal ça en C++.
    Un tableau ne peut être créé de cette manière qu'avec une taille connue à la compilation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<double> def(resultf.size());
    std::vector<double> tdef(resultf.size());

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Bon, j'ai résolu mon problème. C'était pas dans mon programme mais dans mes fichiers txt.
    En fait, mon vecteur temps que je devais recaler sur l'autre avait plus de valeurs (composantes) mais les valeurs étaient plus petites. Du coup, le programme cherchait des valeurs hors de la taille de mes tableaux. Je mets quand même mon nouveau programme mais je doute qu'il servira à quiconque:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    int main()
    {
        double k;
        // Récupération des données du fichier "force" préalablement trié avec Matlab
            vector< vector<double> > resultf;                                                                       // création d'une matrice dynamique
            ifstream ifsf("C:/Users/Professor Satchafunk/Documents/Master/Master 2/Stage/code_2/50_1mms_f.txt");    // ouverture du fichier de données txt
            string strf;
            while(getline(ifsf,strf))                                                                               // tant qu'il y a une ligne à lire
            {
                vector <double> tempf;                                                                              // on crée un tableau temporaire de flottants
                stringstream ss;                                                                                    // on crée un flux de conversion (buffer)
                ss << strf;                                                                                         // que l'on rempli avec la chaîne lue
                while(ss >> k)                                                                                      // tant que l'on peut lire un entier dans la ligne
                {
                    tempf.push_back(k);                                                                             // on l'insère dans le tableau temporaire
                }
                resultf.push_back(tempf);                                                                           // on insère le tableau temporaire dans le tableau de résultat.
            }
            ifsf.close();
     
        double n;
        // Récupération des données du fichier "déformation" issu de Correla
            vector< vector<double> > resultd;                                                                       // création d'une matrice dynamique
            ifstream ifsd("C:/Users/Professor Satchafunk/Documents/Master/Master 2/Stage/code_2/def.txt");          // ouverture du fichier de données txt
            string strd;
            while(getline(ifsd,strd))                                                                               // tant qu'il y a une ligne à lire
            {
                vector <double> tempd;                                                                              // on crée un tableau temporaire de flottants
                stringstream ss;                                                                                    // on crée un flux de conversion (buffer)
                ss << strd;                                                                                         // que l'on rempli avec la chaîne lue
                while(ss >> n)                                                                                      // tant que l'on peut lire un entier dans la ligne
                {
                    tempd.push_back(n);                                                                             // on l'insère dans le tableau temporaire
                }
                resultd.push_back(tempd);                                                                           // on insère le tableau temporaire dans le tableau de résultat.
            }
            ifsd.close();
     
        // Calcul du vecteur temps pour les déformations
            std::vector<double> td(resultd.size());
            td[0] = 0;
            for (int i=1;i<resultd.size();i++)
            {
                td[i] = resultd[i][0] * (1/f);
            }
     
        // Traitement des données : recalage du vecteur temps des déformations sur le vecteur temps de la force
            int t(1);
            int e(0);
            std::vector<double> def(resultf.size());
            std::vector<double> tdef(resultf.size());
            def[0] = 0;
            tdef[0] = 0;
            for (int i=1;i<resultf.size();i++)
            {
                if (resultf[i][0] < td[resultd.size()-1])
                    {
                        e++;
                        while ((td[t] - resultf[i][0])<0) t++;
                        if (fabs(td[t]-resultf[i][0]) < fabs(td[t-1]-resultf[i][0]))
                        {
                            def[i] = -resultd[t][7];
                            tdef[i] = td[t];
                        }
                        else
                        {
                            def[i] = -resultd[t-1][7];
                            tdef[i] = td[t-1];
                        }
                    }
            }
    Merci à ceux qui ont répondu tout de même

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    segmentation fault, c'est toujours dans le programme.
    C'est visible quand les données soulèvent le problème, mais c'est une GRAVE faute: une fuite mémoire.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [LibreOffice][Tableur] Problème avec le tri des données
    Par clairetj dans le forum OpenOffice & LibreOffice
    Réponses: 5
    Dernier message: 21/02/2015, 00h19
  2. Réponses: 2
    Dernier message: 02/09/2014, 21h41
  3. problème de tri de données par requête
    Par plawyx dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/09/2012, 14h18
  4. Probléme Tri et données correspondantes
    Par VBA_girl dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/05/2011, 10h53
  5. Probléme tri des donnée de sortie
    Par jeannotmer dans le forum 4D
    Réponses: 10
    Dernier message: 12/07/2007, 15h57

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