C - Segfault pour un trop de variable int ?

snakest -  
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'ai fais rapidement (peut etre trop), un prog pour faire des tournois (foot) à 3 participants.
Le programme demande les noms, établi les matchs, et fait un tableau récapitulatif grace aux scores des matchs qu'il demande. Format du score -> 3-0
Le programme Segfault 1fois sur deux après rentré les 3 participants.
sinon apres le 1er ou 2eme tableau de récape.
La variable banque de type int pète complet.

Voila je suis un peu perdu.

voila le code ->


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <string.h>
#include <time.h>

void    main()
{
  char  *p[3];
  int   tab_match[3][2];
  int   rando[3];
  int   point[3];
  int   goala[3];
  int   but_m[3];
  int   but_p[3];
  int   banque[3];
  int   a;
  char  *bonbon;
  char  *result;
  int   r1;
  int   r2;
  int   b;

  srand(time(NULL)); // init le rand                                                                  

  // Init tab_match                                                                                   
  tab_match[0][0] = 0;
  tab_match[1][0] = 1;
  tab_match[2][0] = 2;
  tab_match[0][1] = 1;
  tab_match[1][1] = 2;
  tab_match[2][1] = 0;

  //Init point goala but_m but_p                                                                      
  b = 0;
  while (b < 3)
    {
      point[b] = 0;
      goala[b] = 0;
      but_m[b] = 0;
      but_p[b] = 0;
      banque[b] = 0;
      my_put_nbr(but_p[b]);
      b++;
    }

//Init début tournoi                                                                                
  my_putstr("\n\nTournoi Fifa 13 avec 3 joueurs\n\n\n\n");
  my_putstr("\n\nNom du 1er  joueur : ");
  p[0] = get_next_line(0);
  my_putstr("\n\nNom du 2eme joueur : ");
  p[1] = get_next_line(0);
  my_putstr("\n\nNom du 3eme joueur : ");
  p[2] = get_next_line(0);
  my_putstr("\n\nTout est OK, c'est parti !!!\n\n\n\n\n");

  //init des random                                                                                   
  rando[0] = rand() % 3;
  rando[1] = rand() % 3;
  while (rando[1] == rando[0])
    rando[1] = rand() % 3;
  rando[2] = 3 - rando[0] - rando[1];

  //match aller                                                                                       
  a = 0;
  while (a < 3)
    {
      printf("\nMatch numero %d\n            %s VS %s !\n", a + 1, p[tab_match[rando[a]][0]], p[tab_match[rando[a]][2]]);

      euro = "non";


        my_putstr("\n\nY a t il 1 bonbon en jeu ? ");
        euro = get_next_line(0);

      //get result                                                                                    
      my_putstr("\n\nResultat :");
      result = get_next_line(0);

    //les points                                                                                    
      if (result[0] < result[2])
        point[tab_match[rando[a]][2]] += 3;
      else if (result[0] > result[2])
        point[tab_match[rando[a]][0]] += 3;
      else if (result[0] == result[2])
        {
          point[tab_match[rando[a]][0]]++;
          point[tab_match[rando[a]][2]]++;
        }

      //le resultat                                                                                   
      r1 = my_getnbr(result);
      result++;
      result++;
      if (r1 >= 10)
        result++;
      r2 = my_getnbr(result);

      //le goal averrage                                                                              
      goala[tab_match[rando[a]][0]] += (r1 - r2);
      goala[tab_match[rando[a]][2]] += (r2 - r1);

      //les buts m                                                                                    
      but_m[tab_match[rando[a]][0]] += r1;
      but_m[tab_match[rando[a]][2]] += r2;

      //les buts p                                                                                    
      but_p[tab_match[rando[a]][0]] += r2;
      but_p[tab_match[rando[a]][2]] += r1;

     //espace                                                                                      
      b = 0;
      while (b < 10)
        {
          printf("\n");
          b++;
        }

      //banque                                                                                        
      if (strncmp(bonbon, "oui", 3) == 0)
        if (r1 < r2)
          {
            banque[tab_match[rando[a]][0]]--;
            banque[tab_match[rando[a]][2]]++;
          }
        else if (r1 > r2)
          {
            banque[tab_match[rando[a]][0]]++;
            banque[tab_match[rando[a]][2]]--;
          }

      //affichage des score                                                                           
      printf("\033[90m\n");
      printf("\t+---------------+---------------+---------------+---------------+---------------+---------------+\n");
      printf("\t| \033[94mNom\033[90m \t\t| \033[93mPoints\033[90m\t| \033[93mGoal Averrage\033[90m\t\
| \033[93\                                                                                            
mButs pour\033[90m\t| \033[93mButs contre\033[90m\t| \033[93mBanque\033[90m\t|\n");
      printf("\t+---------------+---------------+---------------+---------------+---------------+---------------+\n");
      b = 0;
      while (b < 3)
        {
          printf("\t| \033[92m%s\033[90m \t| \033[97m%d\033[90m \t\t| \033[97m%d\033[90m\t\t| \033[97\
\                                                                                                     
m%d\033[90m\t\t| \033[97m%d\033[90m\t\t| \033[97m%d\033[90m\t\t|\n", p[tab_match[rando[b]][0]], point\
[tab_match[rando[b]][0]], goala[tab_match[rando[b]][0]], but_m[tab_match[rando[b]][0]], but_p[tab_mat\
ch[rando[b]][0]]), banque[tab_match[rando[b]][0]];
          printf("\t+---------------+---------------+---------------+---------------+---------------+---------------+\n");
          b++;
        }
      printf("\n\033[0m");


      a++;
    }







4 réponses

[Dal] Messages postés 6373 Statut Contributeur 1 106
 
Salut snakest,

Non, le nombre de variables n'a rien à voir.

L'erreur "Segfault" se produit quand ton programme tente d'accéder à une partie de la mémoire qui n'a pas été allouée par le programme.

Cela peut se produire si tu essayes de mettre plus de données dans un tableau de int que celui-ci peut en contenir compte tenu de son allocation de mémoire (par exemple, si en utilisant int point[3]; tu dépasses 3 éléments, en utilisant un indice 3, 4, 5... pour tes tableaux de int).

Il se peut aussi que ce soient tes chaînes de caractères. Les variables que tu déclares sont des pointeurs sur char ou des tableaux de pointeurs sur char, dont les espaces mémoire sensés être pointés ne sont peut-être pas allouées.

Par exemple, char *p[3]; qui semble être utilisé pour les noms des participants. C'est un tableau de pointeurs sur des chars. A quel moment alloues-tu la mémoire des chaînes vers lesquelles les pointeurs sont sensés pointer ?

Ton code, de toutes façons ne compile pas car il manque une accolade fermante (peut-être une erreur de copier-coller), et parce que "euro" (qui n'est pas déclaré), ne peut pas être initialisé comme tu le fais euro = "non"; quelque soit son type. Pour assigner une valeur à une chaîne en C, tu utilises strcpy ou mieux strncpy (il faut au préalable s'assurer que l'espace alloué est suffisant pour recevoir les données que l'on veut copier, bien sûr).

Ton code doit être incomplet, car les fonctions suivantes ne sont déclarées nulle part : my_put_nbr, my_putstr, get_next_line, my_getnbr.

En particulier, selon la logique de ton code, get_next_line devrait retourner un pointeur vers une chaine C dont la mémoire devrait être allouée par la fonction. Est-ce le cas ?

Il y a des tas d'autres problèmes dans ton code, mais on va y aller progressivement, pour, déjà, essayer de répondre à ta question.

Dal
2
snakest
 
Et donc, le fait d'avoir autant de vairable int peut-il etre la cause du segfault?
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Pourquoi reposer une question à laquelle on t'a déjà répondu ??
Je remets : Non, le nombre de variables n'a rien à voir.

Réponds au post de [Dal], il y a probablement la réponse à ton problème :-)
0
[Dal] Messages postés 6373 Statut Contributeur 1 106
 
en fait, mon post apparaît en premier car il a été "plussé", mais il est bien postérieur à celui-ci :-) .. c'est vrai que cela prête à confusion (surtout en commençant par "Et donc" ;-)
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Oups ^^.
0
snakest
 
Bonjour

Merci beaucoup pour cette réponse complète ! Je suis désolé de ne pas avoir répondu avant mais j'ai été trés occupé ces derniers jours.
Je fais publierais une réponse cette après midi
0
snakest
 
Ayant encore moins de temps que prévu, je ferrais une réponse demain
0