IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Transformation de PASCAL en C


Sujet :

C

  1. #21
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Bonjour,

    Ton typedef typedef struct element *filed ; peu te poser des problème. Tes fonctions déclarent des pointeurs de pointeurs, c'est à dire, qu'il te faudrat faire un malloc pour utiliser ce pointeur, puis un autre malloc pour ta structure. Complication inutile, un typedef typedef struct element filed ; suffit.

    Dans ta fonction Création, il FAUT toujours tester le retour d'allocation mémoire. Présume que la fonction malloc ne puisse pas te retourner de la mémoire ! Elle te renverra un pointeur NULL. Donc lors de ton initialisation, tu vas écrire à un endroit interdit.
    Tu n'est pas obligé de passer par une variable intermédiaire pour assigner les valeurs à ta structure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* Création d'un nouvel élément */
    // e  : est un pointeur sur une structure d'élément
    void creation(filed *e, int pri, char val)
    {
        e = (filed*)malloc(sizeof(filed)) ;
        if(e!=NULL) {
            e->pri = pri ;
            e->val = val ;
            e->suiv = NULL ;
         }
    }
    Nota: Une fonction peut retourner un pointeur. Ta fonction creation peut être de cette forme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* Création d'un nouvel élément */
    // creation : Retourne un pointeur alloué en mémoire sur une structure élément
    filed *creation(int pri, char val)
    {   filed *e ;    // Pointeur provisoire
     
        e = (filed*)malloc(sizeof(filed)) ;
        if(e!=NULL)
            e->pri = pri ;
            e->val = val ;
            e->suiv = NULL ;
         }
     
         return e ;    // Retourne la valeur du pointeur (peut-être NULL)
    }
    Appel de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    filed liste ;
     
    liste = creation(2, 5) ;
    if(liste==NULL) {
        printf("Erreur d'allocation mémoire.\n") ;
        // Ici libérer la mémoire précédemment allouée
        return 0 ;    // Sortie de programme
    }
    Bonne continuation.
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  2. #22
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut
    merci bien pour votre soutient
    voila les erreurs que j'ai eu
    aidez moi svp !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    #include<stdio.h>
    #include <stdlib.h>
     
    typedef struct element {
        int pri ;
        char val ;
        struct element *suiv ;
    } filed ;
     
    /* Création d'un nouvel élément */
    void creation(filed *e,int pri, char val)
    {
        new(*e);
        e->pri=pri;
        e->val=val;
        e->suiv=NULL;
    }
    /*afficher dune filed*/
    void afficher(filed l)
    {
     filed *q;
     *q=l;
     while(q!=NULL) {
     printf("Priorite:> %d",q->pri);
     printf("Valeur => %c",q->val);
     q=q->suiv;
                       }
    }
    /*insert en queu */
    void emfiler(filed *l,int pe,char ve)
    {    filed e,q;
         creation(&e,pe,ve);
         if (l==NULL)  *l=e;
         else {
         q=*l;
         while(q->suiv!=NULL) q=q->suiv;
         q->suiv=e;
                   }
    }
    /*supression de la tete*/
    void defiler(filed *l,int *pd,char *vd)
    {
     filed q,p;
     q=*l;
     p=*l;
     p=p->suiv;
     q->suiv=NULL;
     *pd=q->pri;
     *vd=q->val;
     free(q);
    }
    /*insertion en tete*/
    void empiler(filed *l,int pe,char ve)
    {
     filed e,q;
     creation(&e,pe,ve);
     if (l=NULL)  *l=e;
     else {
     e->suiv=*l;
     *l=e;
         }
    }
    /*suppression de la tete*/
    void depiler(filed *l,int *pd,char *vd)
    {
     filed q,p;
     q=*l;
     p=*l;
     p=p->suiv;
     q->suiv=NULL;
     *pd=q->pri;
     *vd=q->val;
     free(q);
    }
    /*max pri*/
    void maxpri(filed l,int *pm,char *vm)
    {
     filed q,x;
     q=l;
     x=l;
     while(q!=NULL)  {
     if((q->pri)>(x->pri)) x=q;
     q=q->suiv;
               }
               *pm=x->pri;
               *vm=x->val;
     }
    /*defiler par priorite*/
    void defilerpri(filed *l,int *pd,char *vd)
    {
         filed q,ls,t,p,r;
         char vs;
         int ps;
         ls=NULL;
         p=*l;
         maxpri(*l,pd,vd);
         while((p->pri!=*pd)&&(p->val!=*vd)) {
         defiler(l,&ps,&vs);
         empiler(&ls,ps,vs);
         r=*l;                                   }
    if((r->val=vd)&&(r->pri=pd))  defiler(l,pd,vd);
    if (ls!=NULL){
    	do
    	{
    	depiler(ls,ps,vs);
    	empiler(l,ps,vs);}
    	while(ls!=NULL);
    	}
    			}
    int main()
    {
    /*declaration des types et viables*/
    filed l,lp;
    char choix;
    int prio,dp;
    char vale,dv;
    /*programme principal*/
     
    l=NULL;
    lp=NULL;
    choix='y';
    printf(">L ELEMENT LE PLUS PRIORITAIRE EST CELUI QUI A LA PRIORITE LA PLUS SUPERIEUR<\n");
    printf("\n");
    while(choix!='n') {
    printf("Entrer la valeur(un caractere):\n");
    scanf("%c",&vale);
    printf("Entrer la priorite(un entier):\n");
    scanf("%d",&prio);
    emfiler(&l,prio,vale);
    printf("Voulez vous ajoutez un element?  (y/n)\n");
    scanf("%c",&choix);
    }
    printf("\n");
    printf("LA FILE DES ELEMENTS CREE\n");
    afficher(l);
    printf("\n");
    printf("LA FILE DES ELEMENTS AVEC LA PRIORITE CROISSANTE\n");
     
    do{
    defilerpri(l,dp,dv);
    empiler(lp,dp,dv);
    }while(l!=NULL);
    afficher(lp);
    getchar();
    }
    _____________________
    Compiling: C:\Users\2011\Desktop\tp2_EXO8.c
    C:\Users\2011\Desktop\tp2_EXO8.c: In function `emfiler':
    C:\Users\2011\Desktop\tp2_EXO8.c:36: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:36: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:37: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c: In function `defiler':
    C:\Users\2011\Desktop\tp2_EXO8.c:46: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:47: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:48: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:49: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:50: error: incompatible type for argument 1 of `free'
    C:\Users\2011\Desktop\tp2_EXO8.c: In function `empiler':
    C:\Users\2011\Desktop\tp2_EXO8.c:59: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c: In function `depiler':
    C:\Users\2011\Desktop\tp2_EXO8.c:69: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:70: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:71: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:72: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:73: error: incompatible type for argument 1 of `free'
    C:\Users\2011\Desktop\tp2_EXO8.c: In function `maxpri':
    C:\Users\2011\Desktop\tp2_EXO8.c:81: error: invalid operands to binary !=
    C:\Users\2011\Desktop\tp2_EXO8.c:82: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:82: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:83: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:85: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:86: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c: In function `defilerpri':
    C:\Users\2011\Desktop\tp2_EXO8.c:94: error: incompatible types in assignment
    C:\Users\2011\Desktop\tp2_EXO8.c:97: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:97: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:101: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:101: error: invalid type argument of `->'
    C:\Users\2011\Desktop\tp2_EXO8.c:102: error: invalid operands to binary !=
    C:\Users\2011\Desktop\tp2_EXO8.c:105: error: incompatible type for argument 1 of `depiler'
    C:\Users\2011\Desktop\tp2_EXO8.c:105: warning: passing arg 2 of `depiler' makes pointer from integer without a cast
    C:\Users\2011\Desktop\tp2_EXO8.c:105: warning: passing arg 3 of `depiler' makes pointer from integer without a cast
    C:\Users\2011\Desktop\tp2_EXO8.c:107: error: invalid operands to binary !=
    C:\Users\2011\Desktop\tp2_EXO8.c: In function `main':
    C:\Users\2011\Desktop\tp2_EXO8.c:119: error: incompatible types in assignment
    C:\Users\2011\Desktop\tp2_EXO8.c:120: error: incompatible types in assignment
    C:\Users\2011\Desktop\tp2_EXO8.c:140: error: incompatible type for argument 1 of `defilerpri'
    C:\Users\2011\Desktop\tp2_EXO8.c:140: warning: passing arg 2 of `defilerpri' makes pointer from integer without a cast
    C:\Users\2011\Desktop\tp2_EXO8.c:140: warning: passing arg 3 of `defilerpri' makes pointer from integer without a cast
    C:\Users\2011\Desktop\tp2_EXO8.c:141: error: incompatible type for argument 1 of `empiler'
    C:\Users\2011\Desktop\tp2_EXO8.c:142: error: invalid operands to binary !=
    Process terminated with status 1 (0 minutes, 0 seconds)
    33 errors, 4 warnings

  3. #23
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Au niveau de la fonction de création reportée ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void creation(filed *e,int pri, char val)
    {
        new(*e);
        e->pri=pri;
        e->val=val;
        e->suiv=NULL;
    }
    new(), à moins que ce soit une fonction que tu aies définie quelque part, n'existe pas en C (En C++, il existe un opérateur new, mais pas en C). Si ici, tu essaies d'allouer de la mémoire sur le tas pour ta structure de type filed, il faut utiliser malloc(), et tu ne peut pas retourner l'adresse de l'espace mémoire retournée par malloc() comme tu le fais ici, car le passage des arguments à une fonction se fait par copie. Deux possibilités:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    filed * creation(int pri, char val)
    {
        filed *self = NULL;
     
        self = malloc(sizeof *self);
        if (self != NULL)
        {
            e->pri=pri;
            e->val=val;
            e->suiv=NULL;
        }
        return self;
    }
     
    void creation(filed **p_self, int pri, char val)
    {
        if(p_self != NULL)
        {
            filed *self = *p_self;
     
            self = malloc(sizeof *self);
            if (self != NULL)
            {
                self->pri=pri;
                self->val=val;
                self->suiv=NULL;
            }
     
            *p_self = self;
        }
    }
    Il y a encore d'autres choses, mais on commence avec ça.

    Avec mes meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  4. #24
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Sinon, dans ta fonction afficher(), tu déréférences ta variable q, de type pointeur sur une structure filed, pour lui affecter la valeur de l, alors qu'aucun espace mémoire a été alloué pour cet objet. Tu déréférences ensuite encore au moment d'accéder aux champs de cette structure. Par ailleurs, la copie, comme tu la fais, ne fonctionne peut-être pas comme tu le penses.

    Peut-être que tu voulais passer à afficher un pointeur, dans ce cas, il suffit de passer l'adresse en argument à q, ce qui initialise l'adresse contenue dans la variable q.

    EDIT: Bon, dans ta fonction emfiler(), tu passes à creation() l'adresse d'une zone mémoire allouée sur la pile. Attention, n'oublie pas que l'espace mémoire alloué pour les variables e et q n'est que temporaire et ne sera plus disponible à la fin de ta fonction. Je maintient donc qu'il est nécessaire que ta fonction alloue la mémoire nécessaire, ou que tu alloues explicitement cette mémoire sur le tas en dehors de creation(). Par ailleurs, ta manipulation des pointeurs montrent que ta compréhension des fondamentaux du langage C est encore fragile. A ce stade, j'ai deux recommandation. Si ce qui t'intéresse est le programme exécutable, utilise un convertisseur (encore que je ne vois pas de raison pour convertir ce programme, on trouve des compilateurs Pascal pour de nombreuses plateformes). Si le but de cette traduction est d'apprendre le C, il est sans doute préférable de reprendre depuis les fondamentaux du langage et de bien comprendre les mécanismes associés à l'alloocation de mémoire et au jeu des pointeurs.

    Avec mes meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #25
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut
    J'ai corrigé les erreurs et mon programme maintenant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    #include<stdio.h>
    #include <stdlib.h>
     
    typedef struct element {
        int pri ;
        char val ;
        struct element *suiv ;
    } filed ;
     
    /* Création d'un nouvel élément */
    void creation(filed *e,int pri, char val)
    {
        e=(filed*)malloc(sizeof(filed*)) ;
        e->pri=pri;
        e->val=val;
        e->suiv=NULL;
    }
    /*afficher dune filed*/
    void afficher(filed l)
    {
     filed *q;
     *q=l;
     while(q!=NULL) {
     printf("Priorite:> %d",q->pri);
     printf("Valeur => %c",q->val);
     q=q->suiv;
                       }
    }
    /*insert en queu */
    void emfiler(filed *l,int pe,char ve)
    {    filed e,*q;
         creation(&e,pe,ve);
         if (l==NULL)  *l=e;
         else {
         q=l;
         while(q->suiv!=NULL)
         {q=q->suiv;}
         *q->suiv=e;
                   }
    }
    /*supression de la tete*/
    void defiler(filed *l,int *pd,char *vd)
    {
     filed *q,*p;
     q=l;
     p=l;
     p=p->suiv;
     q->suiv=NULL;
     *pd=q->pri;
     *vd=q->val;
     free(q);
    }
    /*insertion en tete*/
    void empiler(filed *l,int pe,char ve)
    {
     filed *e,q;
     creation(e,pe,ve);
     if (l=NULL)  l=e;
     else {
     e->suiv=l;
     l=e;
         }
    }
    /*suppression de la tete*/
    void depiler(filed *l,int *pd,char *vd)
    {
     filed *q,*p;
     q=l;
     p=l;
     p=p->suiv;
     q->suiv=NULL;
     *pd=q->pri;
     *vd=q->val;
     free(q);
    }
    /*max pri*/
    void maxpri(filed l,int *pm,char *vm)
    {
     filed *q,*x;
     *q=l;
     *x=l;
     while(q!=NULL)  {
     if((q->pri)>(x->pri)) x=q;
     q=q->suiv;
               }
               *pm=x->pri;
               *vm=x->val;
     }
    /*defiler par priorite*/
    void defilerpri(filed *l,int *pd,char *vd)
    {
         filed q,*ls,t,*p,*r;
         char vs;
         int ps;
         ls=NULL;
         p=l;
         maxpri(*l,pd,vd);
         while((p->pri!=*pd)&&(p->val!=*vd)) {
         defiler(l,&ps,&vs);
         empiler(ls,ps,vs);
         r=l;                                   }
    if((r->val=*vd)&&(r->pri=*pd))  defiler(l,pd,vd);
    if (ls!=NULL){
    	do
    	{
    	depiler(ls,&ps,&vs);
    	empiler(l,ps,vs);}
    	while(ls!=NULL);
    	}
    			}
    int main()
    {
    /*declaration des types et viables*/
    filed *l,*lp;
    char choix;
    int prio,dp;
    char vale,dv;
    /*programme principal*/
     
    l=NULL;
    lp=NULL;
    choix='y';
    printf("\n");
    printf(">L ELEMENT LE PLUS PRIORITAIRE EST CELUI QUI A LA PRIORITE LA PLUS SUPERIEUR<\n");
    printf("\n");
    while(choix!='n') {
    printf("Entrer la valeur(un caractere):\n");
    scanf("%c",&vale);
    printf("Entrer la priorite(un entier):\n");
    scanf("%d",&prio);
    emfiler(l,prio,vale);
    printf("Voulez vous ajoutez un element?  (y/n)\n");
    scanf("%c",&choix);
    }
    printf("\n");
    printf("LA FILE DES ELEMENTS CREE\n");
    afficher(*l);
    printf("\n");
    printf("LA FILE DES ELEMENTS AVEC LA PRIORITE CROISSANTE\n");
     
    do{
    defilerpri(l,&dp,&dv);
    empiler(lp,dp,dv);
    }while(l!=NULL);
    afficher(*lp);
    getchar();
    getchar();
    }
    mais un fois que je l'exécute voila ce qu'il m'affiche

  6. #26
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Bonsoir,

    Il te reste beaucoup de warning. Un warning sous-entend un danger potentiel. Il ne faut pas les négliger et les corriger.
    Nota: Ajouter quelques commentaires à ton code t'aidera plus à comprendre son fonctionnement.

    La fonction creation: Je te conseil vivement, comme beaucoup te l'on dit, de tester ton allocation mémoire. Si elle échoue, c'est risque de segment fault directe.
    Une fonction peut retourner un pointeur et dans ton cas, cela pourrait te simplifier ton écriture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /* Création d'un nouvel élément. Retourne un pointeur sur une structure allouée en mémoire. */
    file *creation(int pri, char val)
    {    filed *e = NULL ;
     
        e = (file*)malloc(sizeof(filed)) ;
        if(e!=NULL) {
            e->pri = pri ;
            e->val = val ;
            e->suiv = NULL ;
        }
        return e ;    // Peut-être NULL en cas d'échec de l'allocation
    }
    La fonction emfiler: Attention avec les pointeurs. Tu as une structure "e" et tu veux lui attribuer une adresse par la fonction création. NON. Il te faut un pointeur sur une structure "*e".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* Insertion d'un élément en queue de la file */
    void emfiler(filed *l, int pe, char ve)
    {   filed *e = NULL ;
     
        if(l==NULL) {
            l = creation(pe, ve) ;
        }
        else {
            e = l ;
            while(e->suiv!=NULL) e = e->suiv ;
            e->suiv = creation(pe, ve) ;
        }
    }
    La fonction defiler: Je pense qu'il doit y avoir une erreur. Si les paires de fonctions empiler et depiler doivent respectivement ajouter et supprimer sur le haut de liste, j'en conclu que les fonctions emfiler et defiler doivent ajouter et supprimer par le bas de liste.
    Le but de cette fonction est de supprimer le dernier élément sans oublier de metter à jour l'avant dernier (->suiv).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /* Suppression de l'élément de queue de la file */
    void defiler(filed *l, int *pd, char *vd)
    {   filed *e = NULL, *r = NULL ;
     
        if(l!=NULL) {
            e = l ;
            while(e->suiv!=NULL) {
                r = e ;         // Pointe sur l'avant dernier élément
                e = e->suiv ;   // Pointe sur le dernier élément
            }
            r->suiv = NULL ;    // Détache le dernier élément de la file
            *pd = e->pri ;
            *vd = e->val ;
            free(e) ;            // Libère la mémoire du dernier élément
        }
    }
    La fonction empiler: Même chose; vérifier tes pointeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* Insertion d'un élément en tete de file */
    void empiler(filed *l, int pe, char ve)
    {   filed *e = NULL ;
     
        e = creation(pe, ve) ;
        if(l==NULL) {
            l = e ;
        }
        else if(e!=NULL) {
            e->suiv = l ;
            l = e ;
        }
    }
    La fonction depiler: Même chose; vérifier tes pointeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /* Suppression de l'élément en tete de file */
    void depiler(filed *l, int *pd, char *vd)
    {   filed *e = NULL ;
     
        if(l!=NULL) {
            e = l ;         // Mémo de la tête de file
            *pd = e->pri ;
            *vd = e->val ;
            l = l->suiv ;   // l pointe maintenant sur l'élément suivant
            free(e) ;       // Libère la mémoire de la tête de file
        }
    }
    La fonction afficher: La liste doit être passée en tant que pointeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* Affichage des élément d'une file */
    void afficher(filed *l)
    {   filed *q = NULL ;
     
        q = l ;
        while(q!=NULL) {
            printf("Priorite: %d\n", q->pri) ;
            printf("Valeur  : %c\n", q->val) ;
            q = q->suiv ;
        }
    }
    La fonction maxpri: La liste doit être passée en tant que pointeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* Recherche de la priorité max */
    void maxpri(filed *l, int *pm, char *vm)
    {   filed *q = NULL, *x = NULL ;
     
        q = l ;
        x = l ;
        while(q!=NULL) {
            if((q->pri) > (x->pri)) x = q ;
            q = q->suiv ;
        }
        *pm = x->pri ;
        *vm = x->val ;
    }
    Le main:
    - Ta saisie de caractères et de valeur n'est pas fonctionnel. Je te conseil de lire cette FAQ Comment lire une ligne de manière securisée ?.
    - Pour faire une convertion d'une chaine de caractères numérique vers un nombre, tu peux utiliser les fonctions suivantes: strtol ou sscanf.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Exemple avec sscanf
    char buffer[20] ;
    int ret = 0, priorite = 0 ;
     
    if(read_stdin(buffer, 20)!=NULL) {
        ret = sscanf(buffer, "%d", &priorite) ;
        if(ret==1)
            printf("priorite = %d\n", priorite) ;
    }
    Voila pour une première correction. A toi de jouer.
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  7. #27
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut
    Elijha, merci bien pour votre aide
    mais j'ai pas bien compris le truc de main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Exemple avec sscanf
    char buffer[20] ;
    int ret = 0, priorite = 0 ;
     
    if(read_stdin(buffer, 20)!=NULL) {
        ret = sscanf(buffer, "%d", &priorite) ;
        if(ret==1)
            printf("priorite = %d\n", priorite) ;
    }

Discussions similaires

  1. Transformer un code Pascal en algorithme simple et explication de la simulation
    Par nadirmabed dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 01/01/2015, 21h16
  2. Passer du Pascal à Delphi
    Par poppels dans le forum Langage
    Réponses: 7
    Dernier message: 30/08/2002, 21h07
  3. FFT(Fast Fourier Transform)
    Par IngBen dans le forum Traitement du signal
    Réponses: 6
    Dernier message: 23/05/2002, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo