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 :

Segmentation fautl aleatoire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 190
    Par défaut Segmentation fautl aleatoire
    Bonjour ! Bon pour mes cours je doit ecrire un programme qui demande a l'utilisateur de saisir une promotions d'etudiants cependant mon programme bugue en général apres la saisie de 2 etudiants et ne considere pas mon controle de la longueur du nom (le nom ne doit pas depasser caracteres ). Je vous met le code ci dessous :
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "note.h"
    #include <string.h>
     
    struct note* saisie_bulletin(){
      int nbUE, i=0;
      struct note* tab;
      struct note marqueur={-1,-1};
     
      printf("Combien d'Unités de Valeurs voulez vous creer ?\n Entrez un entier.");
      scanf("%d",&nbUE);
      printf("La fonction va creer un tableu contenant autant de cases que vous avez demandez.\n");
      tab= (struct note*)malloc((nbUE+1)*sizeof(struct note*));
      if(tab == NULL){ return tab;}
      /*La derniere case est a -1 : elle marque la fin du tableau*/
      *(tab+nbUE+1)=marqueur;
      /* Initialisation du tableau*/
      printf("Entrez les notes de l'etudiant:");
      while(i < nbUE){
        printf("Entrez l'ue concernée :");
        scanf("%d", &(tab[i].ue));
        printf("Entrez la note :");
        scanf("%d", &(tab[i].note));
        while (tab[i].note < 0 || tab[i].note >20){ 
          printf("Mauvaise saisie.\nRecommencez.");
          scanf("%d", &(tab[i].note));      
        }
        i++;
      }
      return tab;
    }
     
    struct etudiant saisie_etudiant(){
     
      struct etudiant etu;
      char *s;
      int saisieok=0;
      s= (char*)malloc((9)*sizeof(char));
      printf("Vous allez entrer le nom et la note d'un etudiant.\n");
      printf("Entrez le nom :\n");
      scanf("%s", s);
      s[9]=0;
      etu.nom=s;
      free(s);
      while(strlen(etu.nom) > 9){
        printf("Mauvaise saisie : nom trop long.\n");
        scanf("%s", s);
        s[9]=0;
        etu.nom=s;
        free(s);
      }
      printf("Entrez les notes de cet etudiant.\n");
      etu.liste=saisie_bulletin();
      return etu;
    }
     
    struct etudiant* saisie_promo(){
     
      struct etudiant* promo;
      struct etudiant saisie;
      int i=0, taillepromo=50,test=1;
     
      /*Initialisation du tableu*/
      promo= (struct etudiant*)malloc((taillepromo)*sizeof(struct etudiant));
      perror("Erreur lors de la creation du tableau promo.\n");
      /*Creation du tableau promo*/
      printf("Si vous etes arrivé à la fin de votre promo, entrez un nouvel etudiant dont le nom vaut NULL.\n");
      while(test!=0){
        saisie=saisie_etudiant();
        promo[i]=saisie;
        if(i%taillepromo==0){
          taillepromo += 25;
          realloc(promo,taillepromo*sizeof(struct etudiant*));
          perror("Erreur lors de la reallocation de la promotion.");
        }
        test=strcmp(saisie.nom, "NULL");
        i++;
      }
      /*Test*/
      printf("Fin de la saisie de la promotion.\n");
      while(1){i++;}
      return promo;
    }
     
    struct note{
      int ue;
      int note;
    };
     
    struct etudiant {
      char *nom;
      struct note *liste;
    };
     
    struct note* saisie_bulletin();
    struct etudiant saisie_etudiant();
    struct etudiant* saisie_promo();
     
     
     
    #include "note.h"
     
    int main(){
      /*saisie_bulletin();*/
      /*saisie_etudiant();*/
      saisie_promo();
     
      return 0;
    }
    SI vous reussissez à vous retrouver la dedans et que vous me trouvez mon erreur je vous ne vous remercierais jamais assez ^^

  2. #2
    Membre Expert
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Par défaut
    La fonction scanf ne vide pas le buffer clavier et n'est pas sécurisée. A moins d'être un expert de la fonction, il vaut mieux ne pas l'utiliser.

    http://c.developpez.com/faq/?page=cl...EN_scanf_fgets
    Scanf démythifiée

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut
    Salut,

    Une chose me derange.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct note* saisie_bulletin(){
      ....
      tab= (struct note*)malloc((nbUE+1)*sizeof(struct note*));
      if(tab == NULL){ return tab;}
      /*La derniere case est a -1 : elle marque la fin du tableau*/
      *(tab+nbUE+1)=marqueur;
      ....
    Tu crees un tableau de taille nbUE+1 mais pourtant apres tu veux aller a la nbUE+1eme case. Tu oublies que dans un tableau, la premiere case est a l indice 0 , et donc la derniere a l indice nbUE (pourtant apres dans la boucle while tu t en souviens bien )

    Sinon comme le dis "La souris du desert" , prudence avec scanf.

    Si l erreur persiste, utilise le bon vieux GDB ou alors valgrind. Ils te permettront de savoir ou se situe l erreur (voir les erreurs ^^).

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 190
    Par défaut
    bonjour ! merci pour vos reponses ! alors deja un probleme resolu : ma boucle de saisie des etudiants ne plante plus en cpours de route (effectivement le nbUEZ+1 était à l'origine de l'erreur), maintenant il me reste à etre sur que ma boucle se termine quand l'etudiant entré a un nom égal à NULL ce qui n'est poas encore le cas.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 190
    Par défaut
    Voila ! porblème resolu : je liberais mon buffer s au moment de la saisie ce que me créait à chaque tour des etudiants vides ^^ un peu génant ! en tout cas merci a vous pour votre aide !

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

Discussions similaires

  1. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 16h15
  2. [TASM] Déclarer le segment de pile
    Par cipher dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 01/10/2002, 03h58
  3. angle entre 2 segments
    Par tane dans le forum Mathématiques
    Réponses: 4
    Dernier message: 25/09/2002, 16h47
  4. Algorithmes de generateur pseudo-aleatoire
    Par funx dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 06/09/2002, 18h33
  5. nombre aleatoire
    Par Bob dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 17/06/2002, 18h12

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