Problème d'affichage d'une File en langage C

hilda787 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
nar6du14 Messages postés 459 Date d'inscription   Statut Membre Dernière intervention   -
salut,
s'il vous plait est ce que quelqu'un peut me dire ou se trouve l'erreur dans mon code. je crois qu'il n y a pas d'erreur de compilation mais quand je l'exécute il m'affiche des connerie
#include <stdio.h>
#include <string>
#include <conio.h>
#include <string>
#include <cstring>
#include <cstdlib>


struct FileFifo {
int* v;
int n;
int premier;
int libre;
int max;
};

void Ajout(FileFifo *f,int e){
if(f->n==f->max){printf("pleine");exit(-1);}
else f->v[(f->libre+1) %f->max]=e;
f->premier=f->premier+1;
f->n=f->n+1;
}
void retrait(FileFifo *f){
if(f->premier==f->libre){printf("vide"); exit(-1);}
else f->premier=(f->premier+1 )%f->max;
f->n=f->n-1;
}
void aff(FileFifo f){
if(f.premier==f.libre){printf("vide");exit(-1);}
else for(int i=f.premier;i!=f.premier-1;(i++)%f.max){
//je ne c'est pas si cette boucle de for est juste
printf("le %deme element est %d:",i,f.v[i]);
}
}
int Egal(FileFifo f,FileFifo g){
if(f.n!=g.n|| f.premier!=g.premier || f.libre!=g.libre) return 0;
else for (int i=f.premier;i!=f.premier-1;(i++)%f.max){if(f.v[i]!=g.v[i]) return 0; exit(-1);}
return 1;
}
main (){
FileFifo f,g;
f.max=g.max=10;
f.v=(int *)malloc(sizeof(int));
g.v=(int *)malloc(sizeof(int));
f.n=f.premier=f.libre=0;
g.n=g.libre=g.premier=0;
Ajout(&f,2);
Ajout(&f,2);Ajout(&f,5);Ajout(&f,11); retrait(&f);Ajout(&f,19);aff(f);}
A voir également:

2 réponses

nar6du14 Messages postés 459 Date d'inscription   Statut Membre Dernière intervention   64
 
retires les 3 derniers include, tu programmes en c t'as pas besoin des version c++ (celle qui débutent par "cs" )

inclus ce qui suit à la place de tous tes include:

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



dans ton main les malloc ne sont pas du tout necessaire. définis juste 2 variables entières supplémentaires et passes leur adresse à f.v et à g.v ex: int fv, int gv;
f.v = &fv;
g.v = &gv

car fv et gv existeront sur la stack jusqu'à la fin du main!!!!


j'aurais préféré au début que tu écrives

typedef struct _FileFifo FileFifo

struct _FileFifo {
int* v;
int n;
int premier;
int libre;
int max;
};

et donc, dans tes functions, que tu ne déclares que les variables FileFifo alors.
0
hilda787 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour votre reponse mais j'ai toujours le meme probleme je crois que l'erreur que j'ai c'est au niveau de l'affichage de la file, parceque il m'affiche jusqu'a 4188eme elemet et moi j'ai juste inserer 3 ou 4 elemet.
0
hilda787 Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
sachant que la file est circulaire
0
nar6du14 Messages postés 459 Date d'inscription   Statut Membre Dernière intervention   64
 
Bon écoute, ta structure FileFifo en elle meme n'est pas bien faite!!!

je te propose ceci

typedef struct _FileFifo FileFifo;

struct _FileFifo
{
int *v;
int nombre_total; //nombre total d'élement dans la file
};

//pour ajouter un n ième élément à la file

boolean Ajout( FileFifo* f, int e)
{
int* tmp = NULL;
if(f == NULL) return false;
else
{
tmp = f->v;
f.v = (int *)malloc( ( sizeof(int) ) * (f->nombre_total + 1) );
memcpy( f->v, tmp, f->nombre_total );
free(tmp);
}
f.nombre_total +=1;
f->v[ f->nombre_total] = e;
return true;
}

int retrait( FileFifo* f, int index)
{
if( f == NULL) return 0;
if(f->nombre_total == 0) return 1;
if( index >= f->nombre_total) return 2;
int* tmp = f->v;
f.v = (int *)malloc( ( sizeof(int) ) * (f->nombre_total - 1) );
if( index != 0)
{
memcpy( f->v, tmp, index );
}
memcpy( ( f->v + index ), ( tmp + index + 1), ( f->nombre_total - index -1 ) );
f->nombre_total--;
free(tmp);
return 3;
}

void affiche_file_fifo(FileFifo* f)
{
int i = 0;
for( i = 0; i < f->nombre_total; i++)
{
printf("\nliste des valeurs\n");
printf(" %d ième element de valeur: %d \n", i, f->v[i] );
}
}

int Egal( FileFifo* f, FileFifo* g)
{
if( f== NULL || g == NULL ) return false;
if(f->nombre_total != g->nombre_total) return 0;
else
{
for(int i = 0; i< f->nombre_total; i++)
{
if( f->v[i] != g->v[i]) return 1;
}
return 2;
}
}
0