C - Segfault pour un trop de variable int ?
snakest
-
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
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 ->
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++;
}
A voir également:
- C - Segfault pour un trop de variable int ?
- Impossible de créer le fichier de travail. vérifiez la variable d'environnement temp - Forum Microsoft Office
- Variable objet ou variable de bloc with non définie - Forum VB / VBA
- Vba range avec variable ✓ - Forum VB / VBA
- Range avec une Variable ✓ - Forum VB / VBA
- Le fichier contient un programme écrit en python. le programme construit un mot secret mais il ne l'affiche pas. modifiez ce programme afin que à chaque itération de la boucle : la variable a augmente de 2 la variable b diminue de 1 ajoutez une instruction pour faire afficher le mot secret construit. quel est ce mot secret ? ✓ - Forum Python
4 réponses
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
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