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
Bonjour,



voici mon programme, quand je l'execute tout marche bien, et soudain, il cesse de fonctionner, svp, aidez moi pour trouver la solution



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 struct personne
{
    char* nom_prenom;
    int carte_idendite;
    int numero_telephone;
    int date_acces;
    int CIN;
    char* etat;
    struct personne* next;

};

struct personne* ajouter_personne(int CIN, int date_acces)
{
                    char nom_prenom;
                    int  telephone;
                  printf("ENTRER LE NOM ET LE PRENOM DE LA PERSONNE\n") ;
                    scanf("%s",&nom_prenom) ;

                    printf("ENTRER NUMERO DU TELEPHONE\n") ;
                    scanf("%d",&telephone);

                    struct personne *p=NULL;

                           p=malloc(sizeof(struct personne));
                           p->etat="libre";
                           p->nom_prenom=nom_prenom;
                           p->carte_idendite= CIN;
                           p->numero_telephone= telephone;
                           p->date_acces= date_acces;
                           p->next=NULL;
                           return p;
                    }
int existe(struct personne* head, int CIN)
{
    struct personne* p;
    p=p->next;
    while((p->next!= NULL)||(p->CIN!= CIN))
    {
        p= p->next;
    };
    if(p->next!=NULL)
    {
        return 1;
    }
    else
        {
            return 0;
        };

}
struct personne* recherche_element_personne(struct personne* head,int CIN)
{
    struct personne* p;
    while (existe(head,CIN)!=0)
    {
        p=p->next;
    }
    return p;
}
  int CIN,date_acces;
  struct personne* head;
  struct personne* p;
int main()
{
    head=NULL;
printf("ENTRER CIN\n") ;
scanf("%d",&CIN) ;
printf("DONNERR LA DATE D'ACCEES\n");
scanf("%d", &date_acces);
  if ((head->next)= NULL)
                    {
                        p= ajouter_personne(CIN,date_acces);
                        head->next =p;
                    }
                    else

                    {
                    if(existe(head->next,CIN)==0 && p->next==NULL)
                     {
                        p->next=ajouter_personne(CIN,date_acces);
                        p=p->next;
                     }
                     else
                    {
                        if(strcmp(recherche_element_personne(head,CIN)->etat,"a empruté")==0)
                       {
                           printf("IL FAUT RENDRE LES LIVRES EN AVANTS");
                        }
                       else
                        {
                        recherche_element_personne(head,CIN)->etat="libre";
                        recherche_element_personne(head,CIN)->date_acces=date_acces;
                        };
                    }
                    }

return 0;

}
A voir également:

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
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
-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
%s
capturera 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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
14 déc. 2013 à 11:09
Bonjour [Dal]
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).
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
16 déc. 2013 à 10:54
@fiddy : merci de cette précision, tu as raison.
0
merci les amis :)
0