Mon programme a cesseé de fonctionner
Résolu/Fermé
ouled omar
-
Modifié par jipicy le 13/12/2013 à 18:32
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 16 déc. 2013 à 10:54
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 16 déc. 2013 à 10:54
A voir également:
- Mon programme a cesseé de fonctionner
- Programme demarrage windows 10 - Guide
- Comment faire fonctionner chromecast - Guide
- Désinstaller programme windows 10 - Guide
2 réponses
[Dal]
Messages postés
6194
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 octobre 2024
1 092
Modifié par [Dal] le 13/12/2013 à 18:54
Modifié par [Dal] le 13/12/2013 à 18:54
Salut ouled omar,
Ton code est très long, il comporte de nombreuses erreurs.
Tu devrais commencer par un code plus court, tester, vérifier qu'il fait ce qu'il est supposé faire, et seulement après passer à la suite.
La compilation sans erreurs ne garantit pas que ton code soit sans erreurs, surtout en C. Par ailleurs, avec un compilateur comme gcc, si tu compiles avec les warnings (au minimum avec l'option
Il faut que tu revoies les notions de déclaration et initialisation de pointeur, d'allocation de mémoire et d'usage de chaînes de caractères en C.
En vrac, et sans être exhaustif, voilà les erreurs qui me sautent aux yeux :
Quand tu définis
Si tu n'alloues pas cette zone mémoire, le pointeur nom_prenom pointe sur quelque chose d'imprévisible.
Pareil pour
Une fois que tu as alloué de l'espace pour stocker ta chaîne, tu ne peux pas faire
En C, pour retourner une structure, tu ne ferais pas :
mais plutôt :
dans cette fonction ajouter_personne, tu déclares
Dans ces conditions, tu ne peux pas faire ensuite
Dans la fonction existe, tu fais :
Mais comme tu n'as fait de déclarer p comme étant un pointeur et que tu ne l'as pas initialisé pour pointer vers une zone mémoire allouée par ton programme où il y a des données pertinentes, il pointe sur quelque chose d'imprévisible, et la ligne qui suit joue avec cela.
Dal
Ton code est très long, il comporte de nombreuses erreurs.
Tu devrais commencer par un code plus court, tester, vérifier qu'il fait ce qu'il est supposé faire, et seulement après passer à la suite.
La compilation sans erreurs ne garantit pas que ton code soit sans erreurs, surtout en C. Par ailleurs, avec un compilateur comme gcc, si tu compiles avec les warnings (au minimum avec l'option
-Wall), tu verras que ton compilateur te signale des choses.
Il faut que tu revoies les notions de déclaration et initialisation de pointeur, d'allocation de mémoire et d'usage de chaînes de caractères en C.
En vrac, et sans être exhaustif, voilà les erreurs qui me sautent aux yeux :
Quand tu définis
char* nom_prenom;, nom_prenom est un pointeur sur char. Pour en faire quelque chose d'utile, tu dois le faire pointer vers une zone de mémoire pouvant accueillir une chaîne de caractères C.
Si tu n'alloues pas cette zone mémoire, le pointeur nom_prenom pointe sur quelque chose d'imprévisible.
Pareil pour
char* etat;
Une fois que tu as alloué de l'espace pour stocker ta chaîne, tu ne peux pas faire
p->etat = "libre";en C. La copie de chaînes ne fait avec
strcpy()qui nécessite d'inclure
string.h.
En C, pour retourner une structure, tu ne ferais pas :
struct personne* ajouter_personne(int CIN, int date_acces)
mais plutôt :
void ajouter_personne(struct personne * p, int CIN, int date_acces)
dans cette fonction ajouter_personne, tu déclares
char nom_prenom;, c'est à dire que nom_prenom est un char.
Dans ces conditions, tu ne peux pas faire ensuite
scanf("%s", &nom_prenom);, car
%scapturera plusieurs caractères.
Dans la fonction existe, tu fais :
struct personne* p; p = p->next;
Mais comme tu n'as fait de déclarer p comme étant un pointeur et que tu ne l'as pas initialisé pour pointer vers une zone mémoire allouée par ton programme où il y a des données pertinentes, il pointe sur quelque chose d'imprévisible, et la ligne qui suit joue avec cela.
Dal
14 déc. 2013 à 11:09
S'il fait char *etat; bien sûr qu'il peut faire etat="libre";
C'est si etat était un tableau que cela serait impossible. En revanche dans le cas présent, il ne pourra pas modifier les éléments de la zone pointée par etat.
@omar,
En plus des erreurs remontées par Dal :
Dans ta structure personne, tu as mis char nom_personne; au lieu de char *nom_personne; Du coup le scanf("%s",...) qui suit peut faire planter le programme. De plus, n'oublie pas de faire pointer ton pointeur sur une zone allouée. Donc usage de malloc()/calloc() pour faire ton scanf(). Ou sinon, utilise simplement partout char nom_prenom[32]; Tu n'auras pas d'allocations à faire.
if ((head->next)= NULL)
Attention, cette condition ne sera jamais exécutée. Ici tu affectes NULL à ta variable. Et tu fais un if sur le NULL (false)... L'opérateur de comparaison en C est == (double égal).
16 déc. 2013 à 10:54