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 :

Variables effacées???


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2005
    Messages : 26
    Par défaut Variables effacées???
    Bonjour,
    Voila j'ai le probleme suivant :
    dans la procedure suivante je fais tout d'abord une premiere trace pour afficher in[i] puis la vient la boucle qui fait appel à la fonction CreeOuModifieLiens qui ne modifie pas ses paramètres et la j'essaye de refaire la meme trace que precedemment mais ca me fait une segmentation fault ! J'ai regardé le i garde la meme valeur donc je me demandais comment c'etait possible que mon tableau soit effacé quand je fais appel à ma seconde fonction ?!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void lectureFenetre(char *in[],int taille)
    {
       ...
       printf("1 : %s,%d\n",in[i],i);////////////////////////
       for(int j=i-tailleNec;j<i+tailleNec+1;j++)
           if(i!=j) tabDeP[j]=CreeOuModifieLiens(in[i],in[j]);    
       printf("2 : %s,%d\n",in[i],i);////////////////////////
       ...
    }
    edit : j'ai oublie de preciser que cela n'arrivait que lorsque i atteignait la valeur 10 (avant ca marche parfaitement )

  2. #2
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Par défaut
    oh du C

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2005
    Messages : 26
    Par défaut
    Ouai on me l'a deja dit...
    Qu'il vaudrait mieux que j'utilise string et compagnie mais le probleme c'est que mon programme est tres gros et tout passer en string s'avererait tres difficile !
    Donc en mettant de cote ce point la, personne a une idée pour mon probleme ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 132
    Par défaut
    Il est déclaré où ton tableau in ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2005
    Messages : 26
    Par défaut
    euh il est declare dans mon main comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(int argc, char *argv[])
    {
        char *out[MAX_TAILLE_PARAGRAPHE]; 
        ...
        lectureFenetre(out,n);
    }
    (ici c'est out parce que c'est une premiere procedure qui me cree ce tableau)

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Par défaut
    Tu fais peut-être des accès en dehors des limites du tableau.
    Et ce genre d'accès peut provoquer des plantages aléatoires.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2005
    Messages : 26
    Par défaut
    C'est pas possible dans ce cas la car je test la valeur de la variable i et elle vaut la meme valeur que juste avant la boucle !

  8. #8
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    ça serait bien que tu donnes la boucle où tu donnes les valeurs à i...
    Sinon quand tu testes ta valeur i, dépasse-t-elle l'indice max de ton tableau (ou min) ?
    Enfin si tu es sous Borland C++ par exemple (ou autre) tu peux utiliser le débugueur très utile pour voir quelle instruction fait planter le programme.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2005
    Messages : 26
    Par défaut
    Tout d'abord ma boucle ne dépasse pas les valeurs qu'elle doit prendre.
    Pour le reste des questions voila la fonction un peu moins épuré :

    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
    void lectureFenetre(char *in[],int taille)
    {
        float tabDeP[WINDOWS_SIZE];
        int ind;
     
        for(int i=0;i<taille;i++)
        {
            ind=0;
            if
                ...
            else
            {
                ajouterMotTableau(in[i+tailleNec]);
                printf("2 : %s,%d\n",in[i],i);////////////////////////
                //Direct co-occurrence effect                
                for(int j=i-tailleNec;j<i+tailleNec+1;j++)
                {
                    if(i!=j)    tabDeP[j]=CreeOuModifieLiens(in[i],in[j]);    
                    printf("bizare : %s,%s\n",in[i],in[j]);////////////////////////
                }
                printf("3 : %s,%d\n",in[i],i);////////////////////////
     
                for(int j=i-tailleNec;j<i+tailleNec+1;j++)
                {
                    if(i!=j)
                    {
                        //Second order co-occurrence effect
                        CreeOuModifieLiensVoisins(in[i],in[j],tabDeP[j]);
                        //on ajoute l'élément lu dans temp pour la reduction de liens (juste au dessous)
                        strcpy(tabTemp[ind++],in[j]);
                    }
                }
                //Occurence without a co-occurrence effect
                ReduitLiens(in[i],tabTemp,ind);
            }
        }
    }

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    ca me fait une segmentation fault !
    Que dit le debugger (ligne de code incriminée, pile d'appels, ...) ?

    A part ça, tu devrais vraiment utiliser des vector et des string. Reprendre ton programme pour les intégrer sera peut-être plus rapide que de corriger toutes ces erreurs inutiles ?

    Sinon à vue de nez, je dirais que dans ton code il y a mille endroits potentiellement fautifs. Vérifie bien que partout où tu écris / concatène / copie / ..., il y a de la mémoire allouée.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2005
    Messages : 26
    Par défaut
    Bon ok vous avez eu raison de moi!!
    Vu que tout le monde me le dit je vais vous ecouter et passer tout mon prgramme avec des vector et des string!
    Petite question rapide : est-ce qu'il existe une fonction de base pour faire une recherche rapide dans un vector de string ?

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Recherche d'élément dans un vector : std::find ou std::find_if. Recherche de sous-chaîne dans un string : std::string::find.

    Tu pourras trouver de bonnes docs de référence dans la FAQ C++.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2005
    Messages : 26
    Par défaut
    ok merci pour ton aide Loulou24 !
    Je reviendrai si jamais j'ai encore des problemes apres avoir tout transformer mon code !

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2005
    Messages : 26
    Par défaut
    Euh Loulou24 t'es toujours la ?? En fait j'ai deja un petit probleme...
    (je pense pas qu'il necessite un nouveau post mais bon!)
    Voila j'ai ca dans mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<string> paragraphe;
    transParagraphe(file,paragraphe);
    et ceci dans ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void transParagraphe(FILE *file,vector<string> paragraphe)
    {...}
    En fait je veux que paragraphe soit un parametre resultat mais en fait meme si au moment ou je fini la fonction transparagraphe le vecteur paragraphe est rempli quand je retourne dans le main il ne l'est plus ?!

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Passage par référence (voir la FAQ ou n'importe quel cours de C++) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void transParagraphe(FILE *file, vector<string>& paragraphe)
    Autre conseil : tant que t'y es, remplace tes FILE par des fstream.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2005
    Messages : 26
    Par défaut
    ok merci !
    Vais essayer les fstream aussi alors...

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2005
    Messages : 26
    Par défaut
    Bon loulou24 j'espere que t'es toujours la!!
    Je viens de tout changer (enfin jusqu'a l'endroit necessaire pour voir si y'avait toujours le bug!) et devine quoi?! il est toujours la...
    Bon le point positif est que j'ai peut etre vu d'ou ca venait mais je ne comprends pas !!

    Le code de lectureFenetre ressemble a ca maintenant :
    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
    void lectureFenetre(vector<string> paragraphe)
    {
        vector<string> tabTemp;
        int taille=paragraphe.size();
        float tabDeP[WINDOWS_SIZE];
        int ind;
     
        for(int i=0;i<taille;i++)
        {
            tabTemp.clear();
            if(i<tailleNec)     //cas de debut de paragraphe
            {... }
            else if((i+tailleNec)>=taille)      //cas de fin de paragraphe 
            {... }
            else
            {   
                cout << i+tailleNec <<"," << taille << endl; //DEBUG pour taille
                //on ajoute a chaque pas le dernier mot dans le tableau (seul mot que l'on a pas encore lu)
                ajouterMotTableau(paragraphe[i+tailleNec]);
                //Direct co-occurrence effect                
                //cout << i << ":" << paragraphe[i] << endl;
                for(int j=i-tailleNec;j<i+tailleNec+1;j++)
                    if(i!=j)    tabDeP[j]=CreeOuModifieLiens(paragraphe[i],paragraphe[j]);    
                //cout << i << "," << paragraphe[i] << endl;
                for(int j=i-tailleNec;j<i+tailleNec+1;j++)
                {
                    if(i!=j)
                    {
                        //Second order co-occurrence effect
                        CreeOuModifieLiensVoisins(paragraphe[i],paragraphe[j],tabDeP[j]);
                        //on ajoute l'élément lu dans temp pour la reduction de liens (juste au dessous)
                        tabTemp.push_back(paragraphe[j]);
                    }
                }
                //Occurence without a co-occurrence effect
                ReduitLiens(paragraphe[i],tabTemp);
            }
        }
    }
    et le probleme arrive toujours lors de la 11 eme boucle (i=10) mais en fait il est cause tout simplement par la variable taille (qui passe dans mon exemple de 12 lorsque i vaut 9 à 1056964608 lors de l'iteration suivante!! Et la j'avoue que je suis bluffé !! :
    (la segmentation fault vient du fait que dans mon ex le programme doit rentrer 2 fois dans le if, 8 fois dans le else et puis 2 fois dans le else if mais il rentre une fois de trops dans le else...)

  18. #18
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Personnellement j'ai du mal à suivre ton code, et puis on ne sait pas ce que font toutes ces fonctions appelées.
    Avec un coup de debugger tu aurais sûrement plus d'indications, tu as essayé ?

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 31
    Par défaut Petit detail important
    Salut
    Ce n'est q'un 'détail' mais tu passes un vector de strings en parametre, et tu le passes par recopie, puis tu ne retournes rien, donc dans ton main tu te retrouves avec le vector tel qu'il etait avant l'execution de ta fonction, donc un vecteur vide.

    donc utilise le passage par reference, comme te l'avait indique justement loulou, pour pouvoir travailler sur le vector que tu crées dans le main, et non avec une copie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void lectureFenetre(vector<string>& paragraphe)

Discussions similaires

  1. Effacer variable de session
    Par bressan dans le forum Langage
    Réponses: 14
    Dernier message: 18/03/2007, 20h57
  2. Effacer des variables globales
    Par Orangina dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 18/03/2007, 11h33
  3. Comment effacer toutes les variables de sessions en une fois
    Par dessinateurttuyen dans le forum Langage
    Réponses: 4
    Dernier message: 03/08/2006, 09h20
  4. [Sécurité] Effacer une variable après insertion ?
    Par psychoBob dans le forum Langage
    Réponses: 7
    Dernier message: 23/04/2006, 23h34
  5. Effacer les variables de session
    Par glsn dans le forum ASP
    Réponses: 2
    Dernier message: 12/12/2003, 13h42

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