Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Fuite avec liste chainées

3 réponses
Avatar
Anonyme
Bonjour,

Je realise une fonction qui extrait des données d'un fichier texte dans le
cadre d'un projet de gestion d'aeroport.
J'arrive à extraire correctement ces données, mais lorsque je les met dans
mes listes chainées (j'en utilise une pour le decollage, une pour
l'atterissage), le programme devient instable !
Je dois avoir une fuite qq part :(
Merci à ceux pouvant m'aider.

Cordialement,

/*

Projet: Gestionnaire d'Aeroport

Fichier: programmation.h

Date: Novembre-Decembre 2003

Auteur: -

Info: prototypes fonctions recuperant les données d'un fichier texte

*/

#ifndef READFILEH

#define READFILEH

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include "typedefinition.h"

#include "listgestionnar.h"

#include "econio.h"

t_base *readfile(const char file[]);

int inputcommand(t_base *handleprog,const unsigned long time, t_basedeco
*handledeco, t_baseatter *handleatter);

#endif

/*

Projet: Gestionnaire d'Aeroport

Fichier: programmation.c

Date: Novembre-Decembre 2003

Auteur:-

Info: fonction permettant de recuperer les données d'un fichier texte

*/

#include "programmation.h"

t_base *readfile(const char file[])

{

char buffer[12];

char tmpfuel[4];

char tmp3[3];

char nom[5];

int erreur = 1;

unsigned long time=0, timer=0;

long fuel, conso;

FILE *fp;

t_fdeco *pdeco, *tmpd, *tmpdprev;

t_fatter *patter, *tmpa, *tmpaprev;

t_base *base;

pdeco = NULL;

patter = NULL;

if(!(fp=fopen(file, "r")))

base = NULL;

else

{

if (!(base = (t_base *)malloc(sizeof(t_base))))

base = NULL;

else

{

//initialisation

base->atter = NULL;

base->deco = NULL;

//on lit le fichier, et on on trouve chaque mot

while(( fscanf(fp,"%s", buffer) == 1 ) && erreur)

{

//on regarde si c une inscritpion temporelle

if (strlen(buffer) == 2)

{

if (atoi(buffer))

{

if( timer < (unsigned long)atoi(buffer) )

timer = (unsigned long)atoi(buffer);

}

}

else if(strlen(buffer) == 12)

{

if (buffer[0]=='D') // classement des évènements par catégories

{

//on recupere le vol

strncpy(nom, &buffer[8],4);

nom[4] = '\0';

//on recupere l'heure

strncpy(tmp3, &buffer[6],2);

tmp3[2]='\0';

if( time = atoi(tmp3))

{

//on regarde si on ajoute pas un avion qui devrait deja avoir decollé

if( timer <= time )

{

//on ajoute dans la liste chainée

if ( pdeco == NULL )

{

//on le fait considerer comme le premier element;

if (tmpd = (t_fdeco *)malloc(sizeof(t_fdeco)))

{

pdeco = tmpd;

base->deco = pdeco;

//on met les données

strcpy(tmpd->numfly, nom);

tmpd->time = time;

tmpd->timer = timer;

tmpd->next = NULL;

}

else

erreur = 0;

}

else

{

tmpdprev = tmpd;

if (tmpd = (t_fdeco *)malloc(sizeof(t_fdeco)))

{

//on met les données

strcpy(tmpd->numfly, nom);

tmpd->time = time;

tmpd->timer = timer;

tmpd->next = NULL;

tmpdprev->next = tmpd;

}

else

erreur = 0;

}

}

}

}

else if (buffer[0]=='A')

{

//on recupere le vol

strncpy(nom, &buffer[8],4);

nom[4] = '\0';

//on recupere l'essence

strncpy(tmpfuel, &buffer[1],3);

tmpfuel[3]='\0';

//on recupere la conso

strncpy(tmp3, &buffer[4],2);

tmp3[2] = '\0';

if ((fuel=atoi(tmpfuel)) && ( conso=atoi(tmp3)))

{

//on ajoute dans la liste chainée

if (patter == NULL)

{

//on le fait considerer comme le premier element;

if (tmpa = (t_fatter *)malloc(sizeof(t_fatter)))

{

patter = tmpa;

base->atter = patter;

//on met les données

strcpy(tmpa->numfly, nom);

tmpa->conso = conso;

tmpa->fuel = fuel;


tmpa->timer = timer;

tmpa->next = NULL;

}

else

erreur = 0;

}

else

{

tmpaprev = tmpa;

if (tmpa = (t_fatter *)malloc(sizeof(t_fatter)))

{

//on met les données

strcpy(tmpa->numfly, nom);

tmpa->conso = conso;

tmpa->fuel = fuel;

tmpa->timer = timer;

tmpa->next = NULL;

tmpaprev->next = tmpa;

}

else

erreur = 0;

}

}

}

}

}

}

fclose(fp);

}

return base;



/*

Projet: Gestionnaire d'Aeroport

Fichier: typedefinition.h

Date: Novembre-Decembre 2003

Auteur: -

Info: definition des differentes structures utilisées

*/

#ifndef TYPEDEFINITIONH

#define TYPEDEFINITIONH

/****************************** DECOLLAGE *****************************/



//sructure decollage

typedef struct s_deco

{

char numfly[5];

unsigned long time;

unsigned long late;

struct s_deco *next;

} t_deco;

//structure de base pour decollage

typedef struct s_basedeco

{

t_deco *ls; //liste chainee vers strucuture contenant l'ensemble des avions
decollant

t_deco *actual; //liste chainée vers les avions a traiter

unsigned long nb; //nombre d'avions decollant ou decollé dans la liste

unsigned long nbtooken; //nombre d'avion ayant decoller

unsigned long late; //retard total

} t_basedeco;

//Strucuture decollage pour fichier

typedef struct s_fdeco

{

char numfly[5];

unsigned long time;

unsigned long timer;

struct s_fdeco *next;

} t_fdeco;

/****************************** ATTERISSAGE *****************************/

//structure atterissage

typedef struct s_atter

{

char numfly[5];

long fuel;

long conso;

unsigned long time;

int etat;

struct s_atter *next;

} t_atter;



//structure de base pour aterissage

typedef struct s_baseatter

{

t_atter *insky; //avion dans le ciel

t_atter *onearth; //Avion crashés ou ayant atteri

t_atter *lastonearth; //Dernier element de onearth

unsigned long nb; //nombre d'avions dans la liste

unsigned long nbonearth; //nombre d'avions atteris

unsigned long nbcrash; //nombre d'avions crashé

unsigned long nbemergency; //nombre d'avions atteri en urgence


} t_baseatter;

//structure atterissage pour fichier

typedef struct s_fatter

{

char numfly[5];

long fuel;

long conso;

unsigned long timer;

struct s_fatter *next;

} t_fatter;

/********************************* SPECIAL ******************************/

typedef struct s_base

{

t_fdeco *deco;

t_fatter *atter;

} t_base;

#endif

3 réponses

Avatar
gpg
Si tu veux que qqn regarde ton code de listes chaînées, tu aurais intérêt à
l'isoler du reste.
Avatar
Anonyme
"gpg" a écrit dans le message de
news:brqdm0$p53$
Si tu veux que qqn regarde ton code de listes chaînées, tu aurais
intérêt
à
l'isoler du reste.



//on ajoute dans la liste chainée

if ( pdeco == NULL )

{

//on le fait considerer comme le premier element;

if (tmpd = (t_fdeco *)malloc(sizeof(t_fdeco)))

{

pdeco = tmpd;

base->deco = pdeco;

//on met les données

strcpy(tmpd->numfly, nom);

tmpd->time = time;

tmpd->timer = timer;

tmpd->next = NULL;

}

else

erreur = 0;

}

else

{

tmpdprev = tmpd;

if (tmpd = (t_fdeco *)malloc(sizeof(t_fdeco)))

{

//on met les données

strcpy(tmpd->numfly, nom);

tmpd->time = time;

tmpd->timer = timer;

tmpd->next = NULL;

tmpdprev->next = tmpd;

}

else

erreur = 0;

}

}

}
Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Anonyme"
wrote:

J'ai repris l'ensemble du code, et je l'ai mis en forme. J'ai ajouté un
petit
code de test (il manque une fonction de destruction).

Remarques générales:

1 - Eviter les affectations dans les tests. Ca rend le code difficile à
lire,
et on se demande si tu n'as pas confondu '=' avec '=='.

2 - Simplifier l'utilisation de malloc() au strict nécessaire :

type_s *p = malloc (sizeof *p);

Ca allège l'écriture et la lecture.

3 - Définir les variables là où on en a besoin. Ca rend le
code plus facile à
lire et à vérifier, ça le prépare au
découpage en fonctions.

4 - Soigner l'indentation

5 - Eviter les accentuées (pas de normalisation)

6 - Eviter les commentaires '//'. Il ne sont pas supportés en C90.

7 - Il est d'usage, pour être fair play avec les anciens systèmes,
que les
noms de fichiers ne dépasse pas le format 8.3 (C'est ce que fait le
langage C
avec ses headers)

8 - Les noms des fichiers et le découpage ne sont pas un modèle de
clarté!

9 - Eviter les lignes de plus de 76 colonnes.

10 - Il manque la définition du format du fichier de donnees.

/*
Projet: Gestionnaire d'Aeroport
Fichier: programmation.c
Date: Novembre-Decembre 2003
Auteur: -
Info: fonction permettant de recuperer les donnees d'un fichier texte
*/

#include "prog.h"
t_base *readfile (const char file[])
{
t_base *base = NULL;
FILE *fp = fopen (file, "r");

if (fp != NULL)
{
t_fatter *patter = NULL;
base = malloc (sizeof *base);

if (base != NULL)
{
char buffer[12];
int err = 0;
unsigned long time = 0;
unsigned long timer = 0;
t_fdeco *pdeco = NULL;

/* initialisation */
base->atter = NULL;
base->deco = NULL;

/* on lit le fichier, et on on trouve chaque mot */
while ((fscanf (fp, "%s", buffer) == 1) && !err)
{
/* on regarde si c une inscritpion temporelle */
if (strlen (buffer) == 2)
{
if (atoi (buffer))
{
if (timer < (unsigned long) atoi (buffer))
timer = (unsigned long) atoi (buffer);
}
}
else if (strlen (buffer) == 12)
{
if (buffer[0] == 'D') /* classement des evenements par
categories */
{
char tmp3[3];
char nom[5];
/* on recupere le vol */
strncpy (nom, &buffer[8], 4);
nom[4] = '';
/* on recupere l'heure */
strncpy (tmp3, &buffer[6], 2);
tmp3[2] = '';

time = atoi (tmp3);
if (time != 0)
{
/* on regarde si on ajoute pas un avion qui devrait deja avoir decolle */
if (timer <= time)
{
t_fdeco *tmpd;
/* on ajoute dans la liste chainee */
if (pdeco == NULL)
{
/* on le fait considerer comme le premier element; */
tmpd = malloc (sizeof *tmpd);

if (tmpd != NULL)
{
pdeco = tmpd;
base->deco = pdeco;
/* on met les donnees */
strcpy (tmpd->numfly, nom);
tmpd->time = time;
tmpd->timer = timer;
tmpd->next = NULL;
}
else
{
err = 1;
}
}
else
{
t_fdeco *tmpdprev;
tmpdprev = tmpd;
tmpd = malloc (sizeof *tmpd);
if (tmpd != NULL)
{
/* on met les donnees */
strcpy (tmpd->numfly, nom);
tmpd->time = time;
tmpd->timer = timer;
tmpd->next = NULL;
tmpdprev->next = tmpd;
}
else
{
err = 1;
}
}
}
}
}
else if (buffer[0] == 'A')
{
char tmpfuel[4];
char tmp3[3];
char nom[5];
long fuel;
long conso;
/* on recupere le vol */
strncpy (nom, &buffer[8], 4);
nom[4] = '';
/* on recupere l'essence */
strncpy (tmpfuel, &buffer[1], 3);
tmpfuel[3] = '';
/* on recupere la conso */
strncpy (tmp3, &buffer[4], 2);
tmp3[2] = '';
fuel = atoi (tmpfuel);
conso = atoi (tmp3);
if (fuel != 0 && conso != 0)
{
t_fatter *tmpa;
/* on ajoute dans la liste chainee */
if (patter == NULL)
{
/* on le fait considerer comme le premier element; */
tmpa = malloc (sizeof *tmpa);
if (tmpa)
{
patter = tmpa;
base->atter = patter;
/* on met les donnees */
strcpy (tmpa->numfly, nom);
tmpa->conso = conso;
tmpa->fuel = fuel;
tmpa->timer = timer;
tmpa->next = NULL;
}
else
{
err = 1;
}
}
else
{
t_fatter *tmpaprev;
tmpaprev = tmpa;
tmpa = malloc (sizeof *tmpa);
if (tmpa)
{
/* on met les donnees */
strcpy (tmpa->numfly, nom);
tmpa->conso = conso;
tmpa->fuel = fuel;
tmpa->timer = timer;
tmpa->next = NULL;
tmpaprev->next = tmpa;
}
else
{
err = 1;
}
}
}
}
}
}
}
fclose (fp);
}
return base;
}


/* main.c */
#include "prog.h"

int main (void)
{
t_base *handleprog = readfile ("data.txt");

if (handleprog)
{
puts ("OK");
}
else
{
puts ("KO");
}
return 0;
}

#ifndef H_READFILE
#define H_READFILE
/*
Projet : Gestionnaire d'Aeroport
Fichier: programmation.h
Date : Novembre-Decembre 2003
Auteur : -
Info : prototypes fonctions recuperant les donnees
. d'un fichier texte
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "types.h"

t_base *readfile (const char file[]);

#endif /* guard */

/*
Projet: Gestionnaire d'Aeroport
Fichier: typedefinition.h
Date: Novembre-Decembre 2003
Auteur: -
Info: definition des differentes structures utilisees
*/

#ifndef H_TYPEDEFINITION
#define H_TYPEDEFINITION

/****************************** DECOLLAGE *****************************/

/* sructure decollage */
typedef struct s_deco
{
char numfly[5];
unsigned long time;
unsigned long late;
struct s_deco *next;
}
t_deco;

/* structure de base pour decollage */
typedef struct s_basedeco
{
/* liste chainee vers strucuture contenant l'ensemble des avions
* decollants */
t_deco *ls;

/* liste chainee vers les avions a traiter */
t_deco *actual;

/* nombre d'avions decollant ou decolle dans la liste */
unsigned long nb;

/* nombre d'avion ayant decoller */
unsigned long nbtooken;

/* retard total */
unsigned long late;
}
t_basedeco;

/* Strucuture decollage pour fichier */
typedef struct s_fdeco
{
char numfly[5];
unsigned long time;
unsigned long timer;
struct s_fdeco *next;
}
t_fdeco;

/****************************** ATTERISSAGE *****************************/

/* structure atterissage */
typedef struct s_atter
{
char numfly[5];
long fuel;
long conso;
unsigned long time;
int etat;
struct s_atter *next;
}
t_atter;

/* structure de base pour aterissage */
typedef struct s_baseatter
{
t_atter *insky; /* avion dans le ciel */
t_atter *onearth; /* Avion crashes ou ayant atteri */
t_atter *lastonearth; /* Dernier element de onearth */
unsigned long nb; /* nombre d'avions dans la liste */
unsigned long nbonearth; /* nombre d'avions atteris */
unsigned long nbcrash; /* nombre d'avions crashe */
unsigned long nbemergency; /* nombre d'avions atteri en urgence */
}
t_baseatter;

/* structure atterissage pour fichier */
typedef struct s_fatter
{
char numfly[5];
long fuel;
long conso;
unsigned long timer;
struct s_fatter *next;
}
t_fatter;

/********************************* SPECIAL ******************************/
typedef struct s_base
{
t_fdeco *deco;
t_fatter *atter;
}
t_base;

#endif /* guard */

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/