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

  1. #1
    Membre habitué
    Message d'erreur dans l'insertion d element d'une pile
    Bonjour,
    J'ai un message d'erreur du type :
    "Erreur C2061 : syntaxe error : identifier 'Element' "
    Il se situe sur la deuxième ligne de "InsertionElementDansPile" du code ci-dessous.

    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
     
    /*...*/
    typedef struct ElementDePile{
         int valeurs;
         struct ElementDePile *Suivant;
    }ElementDePile, *EDP;
     
    EDP NouvellePileDeElement(void){
         return NULL;
    }
     
    bool TestPileDeElement(EDP TPDE){
         if(TPDE == NULL){
                return false;
         }
         else{
                return true;
         }
    }
     
    EDP InsertionElementDansPile(EDP Pile, int a){
         EDP *Element;
         Element = static_cast<Element*>(malloc(sizeof(Element)));
         /.../
    }
    /*...*/

  2. #2
    Expert éminent sénior
    Bonjour,
    1. L'erreur vient du static_cast: Le type Element* n'existe pas.
    2. Si tu es en C++, pourquoi utilises-tu malloc(), et pourquoi utilises-tu un typedef struct X {} X;?
      En C++, struct X {} suffit, et le malloc() est avantageusement remplacé par new. Qui, en C++ moderne, est avantageusement remplacé par un unique_ptr<ElementDePile> et make_unique().
    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.

  3. #3
    Expert éminent sénior
    Salut,

    Ne te serais tu pas trompé de section, car, à l'exception du static_cast, qui n'existe effectivement qu'en C++ ce code est du pur C

    Si on peut trouver "un certain intérêt" (en cherchant vraiment très bien ) au fait d'implémenter soi-même une collection quelconque (qu'il s'agisse d'une pile, d'une file, d'une liste quelque soit sa forme ou d'un arbre binaire) en C++, encore faut il le faire en utilisant le langage car, après tout, tu ne viens pas discuter sur ce forum en latin, hein ?!?

    Or, le latin est au francais ce qu'est le C au C++ : un ancêtre dont ni le francais ni le C++ ne renient l'origine, mais qui reste malgré tout, une langue / un langage totalement différent

    PS : si tu t'es trompé de section, nous pourrons demander à la modération de déplacer ton message
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre habitué
    Normalement je voulais tout coder en C.
    J'avais utilisé le static_cast pour corriger les messages d'erreurs du code d'origine ci-dessous qui m'avait donné 2 messages d'erreurs.
    Ce code se compiler avant plus maintenant.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /*...*/
    EDP InsertionElementDansPile(EDP PDE, int a){
         EDP *Element;
         Element = malloc(sizeof(*Element));
    }
    /*...*/

    Les messages d'erreurs
    - erreur C2440: '=': cannot convert from 'void *' to EDP *'
    - note: Conversion from void* to pointer to non 'void' requires an explicit cast
    Je sais que c'est pas bon de mélanger les deux, mais je n'avais pas le choix je ne trouvais pas de solution pour le corriger en C.

    Si vous en avez-une pour corriger la ligne Element = malloc(sizeof(*Element));

  5. #5
    Expert éminent sénior
    Citation Envoyé par carmen256 Voir le message
    Normalement je voulais tout coder en C.
    Si tu veux codeer en C, code en C!!! Si C++ supporte dans une mesure de plus en plus faible de manipuler du code C, C n'a jamais accepté -- et n'acceptera jamais -- de manipuler du C++.

    Veille aussi à utiliser le bon compilateur par rapport au code (et à l'extension des fichiers) que tu tentes de compiler, à savoir:
    1. un compilateur C si code en C, en utilisant l'extension .c pour ton fichier
    2. un compilateur C++ si tu code en C++, en utilisant l'extension .cpp (ou .cc ou même .cxx) pour ton fichier


    J'avais utilisé le "static_cast" pour corriger les messages d'erreurs du code d'origine ci-dessous qui m'avait donné 2 messages d'erreurs.
    Ben oui, mais static_cast, c'est une instruction C++, et pour qu'elle ait du sens, il faut donc que le code soit écrit ... en C++
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    - erreur C2440: '=': cannot convert from 'void *' to EDP *'
    - note: Conversion from void* to pointer to non 'void' requires an explicit cast
    Et ce genre d'erreur est émis par un compilateur C++, parce que justement tu essaye de lui faire compiler... du code C

    Je sais que c'est pas bon de mélanger les deux,
    C'est même pire que "pas bon"!!!

    Tu vois un peu tous les problèmes que cela t'occaionne

    mais je n'avais pas le choix je ne trouvais pas de solution pour le corriger en C.
    Reprend donc depuis le début : si tu veux coder en C, assures toi que:
    • l'extension du fichier d'implémentation est bel et bien .c
    • tu utilises bel et bien un compilateur C et non un compilateur C++

    Et, en cas de problème (sur un code C compilé avec un compilateur C), adresse toi à ==>la section d'à coté<== pour que les gens qui ont "d'avantage l'habitude" d'utiliser le C puissent te répondre.

    Par contre, si ton objectif est de travailler en C++, commence déjà par écrire du code en ... C++

    Et si tu as des problèmes, n'hésites pas à venir nous demander de l'aide ici, nous nous ferons un plaisir de te répondre

    Si vous en avez-une pour corriger la ligne "Element = malloc(sizeof(*Element));"
    Oui: vire moi cette horreur! Du moins, si tu veux travailler en C++
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog