CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Erreur Segmentation fault

Hersage
Hersage
Niveau 16
24 février 2011 à 21:19:58

Hello,

Je bloque sur une segmentation fault à l'appel de cette fonction, ça fait deux heures que je test et je n'arrive pas à voir clair. Est ce que quelqu'un peut m'apporter son regard extérieur ?

  1. define TMAX 100000

int search_by_title(char *titre, s_livre **tab)
{
int i;

/* Parcours du tableau de structure tab. */
for (i = 0; i < TMAX; i++) {
/* Arrêt si le titre de l'ouvrage est trouvé. */
if (strcmp(tab[i]->titre, titre) == 0) {
printf("Ouvrage de titre %s trouvé, numero %d, auteur %s.\n", titre, tab[i]->num, tab[i]->auteur);

return 0;
}
}

/* Sinon titre non trouvé car sortie de boucle. */
printf("Ouvrage de titre %s non trouve.\n", titre);

return 1;
}

Je pense qu'il y a un soucis avec la ligne :
strcmp(tab[i]->titre, titre) == 0

tab est un tableau de pointeur sur structure. titre sera récupérer dans le main via scanf et mis en paramètre à l'appel de cette fonction.
tab est bien crée avec un double malloc, initialise a NULL, puis chaque case est rempli par lecture dans un fichier. De ce coter le test et l'affichage tournent. Dès l'appel de cette fonction, j'ai une segmentation fault :(

godrik
godrik
Niveau 30
24 février 2011 à 21:40:47

hersage,

je n'ai pas le temps de jetter un oeil maintenant. Je ne sais pas quel compilateur et systeme d'exploitation tu utilises. Sous linux, il existe un utilitaire appelle valgrind qui sert a traquer les erreurs de memoire. L'utiliser pourrait t'amener plus d'information.

Hersage
Hersage
Niveau 16
24 février 2011 à 21:53:49

Je suis sous Mac OS X.
Je n'arrive pas à voir l'erreur.

La fonction parcours le tableau de structure, regard pour chaque itération si le titre stocké dans la structure à la case i du tableau (tab[i]->titre) correspond au titre fourni en argument via strcmp.
S'il le titre correspond, il affiche le titre, numero et l'auteur, c'est a dire la structure stockée dans la case i. Et on sort de la fonction.
Sinon on continu, jusqu'à TMAX, taille du tableau et on sort si on le trouve pas.

Ou ai je fais une erreur ? :snif:

godrik
godrik
Niveau 30
24 février 2011 à 22:21:42

comment est ce que ta structure est initialise ?

fournit un code complet.

Hersage
Hersage
Niveau 16
24 février 2011 à 22:27:29

s_livre **creer_tab()
{
s_livre **tab;
int i, j;

/* Allocation du tableau tab de taille TMAX. */
tab = (s_livre **)malloc(sizeof(s_livre *)*TMAX);
if (tab == NULL) {
printf("Probleme d'allocation.\n");
exit(1);
}

/* Allocation du tableau de structure s_livre. */
for (i = 0; i < TMAX; i++) {
tab[i] = (s_livre *)malloc(sizeof(s_livre));
if (tab[i] == NULL) {
printf("Probleme d'allocation.\n");
exit(1);
}
}

/* Initialisation a NULL du tableau. */
for (j = 0; j < TMAX; j++) {
tab[j]->num = 0;
tab[j]->titre = NULL;
tab[j]->auteur = NULL;
}

return tab;
}

.h
typedef struct livre
{
char *titre;
char *auteur;
int num;
} s_livre;

L'ensemble du code a pas mal de lignes

godrik
godrik
Niveau 30
24 février 2011 à 22:34:52

http://pastebin.com/

strcmp(NULL, "foo"); devrait faire une segfault

Hersage
Hersage
Niveau 16
24 février 2011 à 22:44:19

Ca veut dire que mon tableau est vide ?
Pourtant la fonction creer et la fonction stock qui rempli mon tableau le fait bien :

void stock(s_livre **t)
{
int i, numero; //numero, stock le numero entré par l'utilisateur.
char titre[TAILLE_MAX], auteur[TAILLE_MAX]; //titre et auteur, deux tableaux qui stokent le titre et l'auteur entrés par l'utilisateur.

/* Ouverture du fichier fichier.txt */
FILE *f = fopen("fichier.txt", "r");
if (f == NULL) {
printf("Erreur lors de l'ouverture de fichier.txt\n");
exit(1);
}

/* Stock toutes les lignes du ficher fichier.txt dans le tableau de structure. */
for (i = 0; i < TMAX; i++) {
fscanf(f, "%d %s %s\n", &numero, titre, auteur);
t[i]->num = numero;
t[i]->titre = strdup(titre); //strdup alloue et stock le titre dans t[i]->titre
t[i]->auteur = strdup(auteur);
}

/* Fermeture du fichier. */
fclose(f);
}

Le fichier contient a chaque ligne : num titre auteur
L'affichage du tableau affiche correctement. Pourquoi le tableau serait vide :question:

godrik
godrik
Niveau 30
25 février 2011 à 03:29:20

je ne sais pas bien...
Que se passe t'il si le fichier n'a pas TMAX ligne ? ou si le titre ou l'auteur contienne un espace ?

De facon general, tu devrais utiliser les fonctions "n" des fonctions sur les string (strncmp, strndup, strncpy, ...)

BTW, valgrind fonctionne sur macosX.

Si tu ne trouve pas, fais une archive du code et des donnees et met le tout en ligne quelquepart.

Hersage
Hersage
Niveau 16
25 février 2011 à 15:12:21

Normalement si TMAX est plus grand que le nombre de ligne dans le fichier, les cases en trop du tableau sont NULL.
Dans le fichier, chaque lignes contient : numero titre auteur
Il n'y a pas d'espace dans le titre ou auteur.

J'ai une question, quand je demande à l'utilisateur d'entrer un titre par exemple et que je récupère sa saisi via scanf, est ce que ca pose un problème si l'utilise en paramètre d'une fonction, par exemple pour une recherche de titre?

godrik
godrik
Niveau 30
25 février 2011 à 17:09:55

si elle sont null, alors tu vas appeller strcmp(NULL, "foo");

Tu as passer le code dans un debugger pour voir ce qui se passe ? ou dans valgrind ?

godrik
godrik
Niveau 30
25 février 2011 à 17:38:44

J'ai bien recu ton code par MP.
La prochaine fois, fais une archive ou met le code sur un wall.

Tu as des pointeur non initialise dans le code. Recompile ton code avec tous les warning!

Hersage
Hersage
Niveau 16
25 février 2011 à 17:46:34

Ok je ferrai ça pour la prochaine fois :ok:
Par contre pour moi le problème vient du scanf, je vais re-vérifier pour les pointeurs...

godrik
godrik
Niveau 30
25 février 2011 à 17:54:35

il vient du scanf... compile avec les warning et execute le code dans valgrind. L'erreur apparait immediatement

DreamsIayers
DreamsIayers
Niveau 8
28 février 2011 à 14:50:25

Je pense que le probleme vient du fait que tu vas parcourir ton tableau jusqu'a TMAX structures, mais que si il fait moins de TMAX, tu vas deborder. Je te conseille de mettre un pointeur NULL a la fin de ton tableau de structure, et de mettre comme condition d'arret tab[i].

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment