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 :

fonction d'échange de 2 structures qui prend trop de resource : segmentation fault


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 38
    Par défaut fonction d'échange de 2 structures qui prend trop de resource : segmentation fault
    Bonjour,

    mon code
    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
    struct structure_student {
    	char name[50];
    	int size;
    	bool sex; //sex=0 it's a boy -- sex=1 it's a girl
    };
     
    //****** function exchangeStudent *****
    //* use to exchange the position of 2 students in a table of structure_student
    void exchangeStudent(structure_student* studentS, int a, int b)
    {
    	structure_student temp;
    //put the data of the student a into the temp
    	strcpy(temp.name, studentS[a].name);
    	temp.size=studentS[a].size;
    	temp.sex=studentS[a].sex;
    //put the data of the student b into the data of the student b
    	strcpy(studentS[a].name, studentS[b].name);
    	studentS[a].size=studentS[b].size;
    	studentS[a].sex=studentS[b].sex;
    //put the data of the temp into the data of the student b
    	strcpy(studentS[b].name, temp.name);
    	studentS[b].size=temp.size;
    	studentS[b].sex=temp.sex;
    }
    Ma fonction exchangeStudent marche très bien si je l'appel une dizaine de fois mais si je l'appelle quelque chose comme 200 fois, et ben Segmentation Fault !!!

    Alors je comprend pas, peut être que mon "structure_student temp" ne de détruit pas à chaque foi, du coup il reste en mémoire ?

    Faut-il le déclarer en dynamique, puis le détruire ?
    et alors comment faire ?

    Merci pour toute réponse

  2. #2
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Bonjour,

    Je pense que le plantage vient des paramètres que tu donnes à ta fonction.
    En particulier, si tu lui donne à manger des indices invalides de ton tableau, ça a des chances de planter.

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    structure_student a[10];
    // ceci peut planter car le nom est trop long :
    a[0].name = "123456789012345678901234567890123456789012345678901"; 
    // ceci peut planter à cause du 45 :
    exchangeStudent(&a[0], 4, 45);
    // ceci peut planter à cause du 10 :
    exchangeStudent(&a[0], 4, 10);
    Es-tu en train d'apprendre le C++ ?
    Est-ce à partir d'un livre ? d'un cours ?

    Si tu es en train d'apprendre à gérer la mémoire, je comprends que tu codes comme ça et c'est très bien de commencer par se heurter un petit peu aux problèmes d'assignations de mémoire.

    Mais attention : une fois que tu maitriseras les allocations, les pointeurs, les tableaux, il faudra absolument arréter de programmer comme ceci. Ton code présente d'énormes risques d'erreurs, et c'est justement dans une de ces erreurs que tu as du tomber.

    Un code parfait ne peut pas planter, même s'il est mal utilisé par quelqu'un qui ne connais rien à son fonctionnement. Un code correct essaie d'être parfait.

    Par exemple, ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void exchangeStudent(structure_student* studentS, int a, int b)
    suppose que le :
    • studentS pointe sur un tableau de student alloué (et pas sur NULL ou sur une zone émmoire non-allouée)
    • a et b sont des indices valides pour le dit tableau


    Courage

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 38
    Par défaut
    Merci pour réponse,

    Oui je suis en train d'aprendre le C++.

    Effectivement, il y a des grosses lacunes dans mon code. Est-ce que tu peux me donner quel que truc pour pouvoir proteger mon code ?

    Merci !

  4. #4
    Membre confirmé Avatar de greg13
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 144
    Par défaut
    Si tu fais du C++, envisage d'utiliser les outils du C++, à savoir par exemple les STL Containers pour les tableaux dynamiques, listes, ...
    Voila le site que j'utilise lorsque j'oublie des détails à propos des fonctions, ... http://www.cplusplus.com/reference/stl/
    Mais c'est pas l'idéal pour une première aproche je pense.
    Et puis il existe les transferts de variables par référence en c++.

    Bonne continuation

    Greg

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/03/2015, 16h30
  2. [Doctrine] Doctrine_Collection::save qui prend trop longtemps
    Par Mortagus dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 13/08/2012, 16h24
  3. Label qui prend trop de place
    Par mouss4rs dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 30/05/2012, 09h39
  4. Serveur qui prend trop de mémoire
    Par malag dans le forum Langage
    Réponses: 4
    Dernier message: 02/04/2007, 22h05
  5. Problème de Thread qui prend trop de mémoire
    Par petozak dans le forum Général Java
    Réponses: 20
    Dernier message: 11/12/2006, 15h24

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