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] Mon code ne fonctionne plus

MrPasRobotDuTou
MrPasRobotDuTou
Niveau 3
27 mai 2018 à 22:05:52

Salut salut :)

Je comprends pas... j'ai termine de coder un de mes exos, il fonctionne très bien, je reviens une heure après et pouf, ça fonctionne plus.
En plus je comprends pas le message d'erreur de mon compilateur... Je suis encore un noob, j'ai essaye de googler le message d'erreur mais j'ai pas réussi a en comprendre la raison ni la solution :(

L’énoncer de l'exo : • Écrire une fonction qui découpe une chaîne de caractères en mots.
• Les séparateurs sont les espaces, les tabulations et les retours à la ligne.
• La fonction renvoie un tableau où chaque case contient l’adresse d’une chaîne de
caractères représentant un mot. Le dernier élement du tableau devra être égal à 0
pour marquer la fin du tableau.
• Il ne doit pas y avoir de chaîne vide dans votre tableau. Tirez-en les conclusions
qui s’imposent.
• La chaîne qui sera transmise ne sera pas modifiable.
• Elle devra être prototypée de la façon suivante :
char **ft_split_whitespaces(char *str);

Mon code : https://pastebin.com/34AgEaLd

Le message d'erreur de mon compilateur (gcc) : a.out: malloc.c:2401: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.

Donc voila... je suis assez perdu. Merci de votre aide :ok:

PS : désolé pour les accents manquants, je ne suis pas en azerty

godrik
godrik
Niveau 30
28 mai 2018 à 02:19:14

C'est pas un message du compilateur. C'est un message de la libc. Qui veut probablement dire que tu accedes la memoire la ou tu ne devrais pas. Fait passer ton code dans un debugger memoire comme valgrind.

Deadman93
Deadman93
Niveau 10
28 mai 2018 à 03:23:51

Salut.

J'ai l'impression que tu ne libères à aucun moment la mémoire que tu as allouée pour ton tableau et tes tableaux de char .

Plutôt bizarre comme erreur à l'exécution (je suis plutôt habitué aux segmentation fault pour les problèmes de mémoire). En tapant sur le net, ça a bien l'air d'être une mauvaise accès à la mémoire.

Je remarque qu'à la ligne 81, tu fais :
tab[j++][k] = '\0';

Tu voudrais pas plutôt mettre le '\0' à la du string que tu as alloué ? i.e faire :
tab[j][k++] = '\0';

Car sinon , tu dis qu'à l'emplacement k de la j+1 ième char *, y'aura un \0. Or rien n'indique que lq j+1 ième char * aura une taille inférieure à k. Le cas échéant, ça peut dépasser.

Du coup le problème pourrait venir au moment où tu essaies de lire def après le \ . Ou bien y'a un moment ça retrouve pas le \0 qfin d'arrêter de parcourir la chaîne de caractères. En tous cas, je crois qu'il y a moment où ça accède au-delà de l'allocation prévue.

Pas sûr de ce que je dis mais j'espère que ça t'aidera.

MrPasRobotDuTou
MrPasRobotDuTou
Niveau 3
28 mai 2018 à 10:45:41

Merci pour vos reponses !

godrik, j'ai effectivement tenté de passer mon code a Valgrind, mais malgré mes efforts, je comprends vraiment pas ce qu'il me reproche :(

deadman, alors dans ces exos de 42, on a pas le droit a free pour le moment.
Je suis d'accord avec toi quand a la ligne 81, j'ai donc remplacé. En vain.

Je suis vraiment depassé ahah

EDIT : Deadman, d'ailleurs en ayant mit tab[j][k++] = '\0' bah ca fait que ca ne m'affiche plus rien

Message édité le 28 mai 2018 à 10:50:25 par MrPasRobotDuTou
Deadman93
Deadman93
Niveau 10
28 mai 2018 à 11:53:29

En revoyant le code, j'ai effectivement raconté des conneries. :o))
Les post-incrémentations ne renvoient que la valeur de l'entier avant de l'incrémenter.

Du coup, mauvaise idée de faire tab[j][k++] . La ligne 81 était bonne de base.

Ça m'étonne qu'on t'interdise free() . À chaque fois que tu alloues de la mémoire, faut la libérer une fois que t'as fini de l'utiliser. J'vois pas pourquoi ils t'en empêcheraient. Tu crées une fonction qui libère les chaînes de caractères puis le tableau . T'appelles ça à la fin du programme. C'est peut-être pas la cause de l'erreur mais ça t'éviteras d'avoir d'autres problèmes par la suite.

En regardant la fonction nombre_mots() , entre la ligne 51 et 54 de ce que je comprends : tu parcours toute la chaîne de caractères quand tu rencontres un séparateur, puis tu incrémentes le nombre de mots et i une fois sorti de la 2eme boucle while . Mais que se passe-t-il quand tu rencontres que des lettres ? Ça passe jamais dans la 2eme boucle while , du coup ça incrémente toujours le nombre de mots à chaque fois que tu vois qu'une lettre est suivi d'une autre ?

Mon intuition me dit qu'il manque quelque chose.

Sinon as-tu testé pour différentes strings à parser ? Ça plante à quel moment dans le code ?
Sinon tu peux toujours utiliser une debugger basique comme GDB ou celui de l'IDE si t'en utilises un. Place un point d'arrêt au début de ta fonction ft_split_whitespaces() . Rentre bien dans la fonction et regarde ligne par ligne s'il le faut, utilise les watchers pour voir comment se comportent les différentes variables.

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