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 :

Liste chainée : passing arg 1 .. from incompatible pointer type


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3
    Par défaut Liste chainée : passing arg 1 .. from incompatible pointer type
    Donc voila je cherche a faire une liste chainée toute simple...Et il me met incompatible pointer type pour toutes les fonctions que j'ai crée. Je passe bien en argumente un pointeur sur une liste...Mais il trouve ca incorrect...Si quelqu'un pouvait m'aider...Merci.

    (J'ai un second probleme, quand je fais tourner le programme avec ces warnings, au bout de 4 enregistrements ca plante...Donc surement un probleme dans le malloc ?)

    Erreur :
    main.c:12: warning: passing arg 1 of `initialize' from incompatible pointer type
    main.c:12: warning: passing arg 2 of `initialize' from incompatible pointer type
    main.c:25: warning: passing arg 1 of `newElements' from incompatible pointer type
    main.c:38: warning: passing arg 1 of `addElements' from incompatible pointer type
    main.c:38: warning: passing arg 2 of `addElements' from incompatible pointer type
    main.c:48: warning: passing arg 1 of `printChain' from incompatible pointer type

    ChainFunction.c
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "ChainHeader.h"
     
    //initialize begin and end list
    int initialize (list * f_listBegin, list * f_listEnd)
    {
     
        f_listBegin = NULL;
        f_listEnd = NULL;
     
        return 0;
    }
     
    //Create new Elements and initialize it
    int newElements (list * f_listNew, float f_val)
    {
     
        f_listNew = (list *) malloc(sizeof(list *));
        f_listNew->val = f_val;
        f_listNew->ChainListNext = NULL;
        f_listNew->ChainListBefore = NULL;
     
        return 0;
     
    }
     
    //add elements
    int addElements (list * f_listNew, list * f_listEnd)
    {
     
        f_listEnd -> ChainListNext = f_listNew;
        f_listNew -> ChainListBefore = f_listEnd;
        f_listEnd = f_listNew;
     
        return 0;
     
    }
     
    //Print Chain
    int printChain(list * f_listBegin)
    {
     
      list * listCurrent;
      listCurrent = f_listBegin;
     
    //NULL is the end of the List
      while(listCurrent != NULL)
      {
     
        printf("%d", listCurrent->val);
        listCurrent = listCurrent->ChainListNext;
     
      }
     
      return 0;
    }
    ChainHeader.h
    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
     
    //Create a New Struct
     
     
    typedef struct ChainList
    {
        struct ChainList * ChainListNext;
        float val;
        struct ChainList * ChainListBefore;
    } list;
     
    list * listBegin, * listEnd, * listNew;
     
    int initialize (list * f_listBegin, list * f_listEnd);
     
    int newElements (list * f_listNew, float f_val);
     
    int addElements (list * f_listNew, struct ChainList * f_listEnd);
     
    int printChain(list * f_listBegin);
    Main.c
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "ChainHeader.h"
     
    int main(int argc, char ** argv)
    {
     
        //initialize var
        float nb = 0;
     
        	//Initialize Begin and End
        initialize(&listBegin, &listEnd);
     
        printf("Enter a list of val :\n");
     
        //Ask val
        while(nb != -1)
        {
     
            //Ask var
            scanf("%f", &nb);
            if(nb != -1)
            {
                //create new elements
                newElements(&listNew, nb);
                //If this is the first element in the chainlist
                if(listBegin == NULL)
                {
     
                  listBegin = listNew;
                  listEnd = listNew;
     
                }
                //If it isn't the first element in the chainlist
                else
                {
     
                  addElements (&listNew, &listEnd);
     
                }
     
     
            }
     
        }
     
        //Print boucle
        printChain(&listBegin);
     
        //End of ChainList
    	return 0;
    }

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Salut et bienvenue sur les forums de developpez.com


    Ton problème doit surement venir de là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    initialize(&listBegin, &listEnd);
    et de même pour les autres fonctions car ici tu passes bien l'adresse des pointeurs que tu as déclarés et non pas le pointeur lui même, ce qu'attendent tes fonctions

    Si tu veux passer l'adresse de tes pointeurs aux fonctions, il te faut des pointeurs de pointeurs sur ta liste comme arguments de tes fonctions en lieu et place des simples pointeurs que tu as actuellement !

    Par ailleurs, j'espère pour toi que tu as bel et bien codé une fonction qui libère la liste complète avant la fin de ton programme, je demande car je crois pas l'avoir vu là !


    PS: Bonjour et merci n'a jamais tué personne !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par jeremysup
    (J'ai un second probleme, quand je fais tourner le programme avec ces warnings, au bout de 4 enregistrements ca plante...Donc surement un probleme dans le malloc ?)
    Simplement un comportement indéterminé suite à tes passages des arguments sans doute

    Il faut toujours tenir compte des warnings, s'il y'en a, c'est qu'il y a des problèmes dans ton code donc il faut toujours les résoudres autant que faire se peut
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3
    Par défaut
    Bonjour, désolé

    Et le Merci y etait

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    PS:
    • Tu devrais appeler ta structure chainon plutôt list
    • Tu utilises des variables globales. Non seulement ici, c'est inutile, mais en plus, rien qu'en lisant le header, on voit que tu les utilises mal.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par jeremysup
    Et le Merci y etait
    Désolé, je fait toujours un tir groupé
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f_listNew = (list *) malloc(sizeof(list *));
    Le cas est inutile ici et pour le sizeof utilise le nom de ton pointeur, ca permet de rendre le code plus facilement maintenable. Cela donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f_listNew = malloc (sizeof (* f_listNew));
    Au moins de cette manière il n'y a pas de surprises Pense aussi à tester le retour de malloc au cas où il échouerait !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3
    Par défaut
    Ok tout fonctionne maintenant.
    Enfin je n'ai plus de warning le programme ne plante pas, par contre la fonction printChain ne fonctionne pas lol

    Merci pour tout.

    (Et c'est quoi le probleme avec les var globales et mes en tetes ?)

    Main.c
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "ChainHeader.h"
     
    int main(int argc, char ** argv)
    {
        float nb = 0;
     
     
        /*Initialize Begin and End*/
        initialize(listBegin, listEnd);
     
        printf("Enter a list of val :\n");
     
        //Ask val
        while(nb != -1)
        {
     
            /*Ask var*/
            scanf("%f", &nb);
            if(nb != -1)
            {
                //create new elements
                newElements(listNew, nb);
                //If this is the first element in the chainlist
                if(listBegin == NULL)
                {
     
                  listBegin = listNew;
                  listEnd = listNew;
     
                }
                //If it isn't the first element in the chainlist
                else
                {
     
                  addElements (listNew, listEnd);
     
                }
     
     
            }
     
        }
     
        //Print boucle
        printChain(listBegin);
     
        //End of ChainList
    	return 0;
    }
    ChainHeader.h
    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
     
    typedef struct ChainList
    {
        struct ChainList * ChainListNext;
        float val;
        struct ChainList * ChainListBefore;
    } list;
     
    list * listBegin, * listEnd, * listNew;
     
    int initialize (list * f_listBegin, list * f_listEnd);
     
    int newElements (list * f_listNew, float f_val);
     
    int addElements (list * f_listNew, list * f_listEnd);
     
    int printChain(list * f_listBegin);
    ChainFunction.c
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "ChainHeader.h"
     
    //initialize begin and end list
    int initialize (list * f_listBegin, list * f_listEnd)
    {
     
        f_listBegin = NULL;
        f_listEnd = NULL;
     
        return 0;
    }
     
    //Create new Elements and initialize it
    int newElements (list * f_listNew, float f_val)
    {
     
        f_listNew = malloc (sizeof (* f_listNew));
        f_listNew->val = f_val;
        f_listNew->ChainListNext = NULL;
        f_listNew->ChainListBefore = NULL;
     
        return 0;
     
    }
     
    //add elements
    int addElements (list * f_listNew, list * f_listEnd)
    {
     
        f_listEnd -> ChainListNext = f_listNew;
        f_listNew -> ChainListBefore = f_listEnd;
        f_listEnd = f_listNew;
     
        return 0;
     
    }
     
    //Print Chain
    int printChain(list * f_listBegin)
    {
     
      list * listCurrent;
      listCurrent = f_listBegin;
     
    //NULL is the end of the List
      while(listCurrent != NULL)
      {
     
        printf("%f", listCurrent->val);
        listCurrent = listCurrent->ChainListNext;
     
      }
     
      return 0;
    }

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list * listBegin, * listEnd, * listNew;
    1. Variables globales déclarées et définies dans le fichier d'en-tête. C'est une mauvaise pratique et on se demande comment l'édition de liens marche.
    2. Elles ne sont pas dans un headr approprié, puisque l'es ofnctions de liste ne les utilisent même pas, en fait, elles sont complètement indépendantes des fonctions de listes. Tu devrais donc les mettre dans un autre header.
    3. Es-tu sûr d'avoir vraiment besoin de variables globales ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par jeremysup
    Enfin je n'ai plus de warning le programme ne plante pas, par contre la fonction printChain ne fonctionne pas lol

    Déjà il serait bon de tester la validité des arguments avant d'utiliser (ceux de tes fonctions) quoi que se soit, cela évite bien des surprises pendant le fonctionnement du programme.

    Ensuite, dans la boucle de ton main, à la fin (mais dedans) de la condition
    met un break; sinon tu ne sortira jamais de la boucle donc normal que ta fonction d'impression ne fonctionne pas car elle ne peut être appelée

    Pour finir, listBegin est toujours à la valeur NULL donc même si le programme entre dans ta fonction printChain, elle commencera même pas à parcourir ta liste car ton argument n'est pas valide !

    Mais pourquoi ? Hé bien dans ta fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int newElements (list * f_listNew, float f_val);
    tu modifies le pointeur mais pour que ca prenne effet en dehors de la fonction, il faut utiliser un pointeur de pointeur pour que ce soit correct et donc passer l'adresse de ton pointeur lors de l'appel de la fonction soit ta fonction corrigée:
    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
    //Create new Elements and initialize it
    int newElements (list ** f_listNew, float f_val)
    {
     
        *f_listNew = malloc (sizeof (* f_listNew));
     
        if (*f_listNew != NULL)
        {
           (*f_listNew)->val = f_val;
           (*f_listNew)->ChainListNext = NULL;
           (*f_listNew)->ChainListBefore = NULL;
        }
     
     
        return 0;
     
    }
    et son appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newElements(& listNew, nb);

    Autre chose qui me perturbe un peu, si dans tes fonctions tu retournes systématiquement zéro, ne fait pas renvoyer de valeur à tes fonctions, ca ne sert strictement à rien dans ton cas, sauf si tu changes et que tu retournes des codes d'erreurs, là ok, sinon met void au lieu de int !

    Encore autre chose, n'oublies surtout pas de faire une fonction de libération de ta liste chaînée que tu appeleras avant la fin de ton programme, il faut toujours libérer ce qu'on alloue dynamiquement ... une bonne habitude à prendre le plus tôt possible
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/07/2010, 10h34
  2. Réponses: 15
    Dernier message: 21/01/2009, 15h21
  3. liste chainée passée en parametre
    Par kevinou55 dans le forum Débuter
    Réponses: 3
    Dernier message: 26/11/2008, 13h54
  4. Incompatible pointer type
    Par Spinoza23 dans le forum Débuter
    Réponses: 12
    Dernier message: 27/05/2008, 15h34

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