Forum Programmation.c++ Compilation C++

Posté par  .
Étiquettes : aucune
0
19
nov.
2004

Bonjour!

J'essaie de compiler un simple programme C++ mais je n'y arrive pas.

J'ai des warnings pour les librairies et des erreurs que je ne comprends pas…

J'ai essaié avec les autres librairies (proposées dans le warning), ça ne change rien.

J'ai donc 3 fichiers (voir ci-dessous) que je compile avec :

gcc -o test.out test.cxx ticket.cxx

Mon fichier ticket.h :

include <stream.h>

class ticket

{

private:

int prix;

char num[10];

char date[10];

char destination[10];

public:

ticket();

void setVal();

void affichage();

};

Mon fichier ticket.cxx :

include "ticket.h"

ticket::ticket()

{

strcpy(num,"0");

strcpy(date,"0");

strcpy(destination,"0");

prix=0;

}

void ticket::setVal()

{

cout << "Numero = "; cin >> num; endl;

cout << "Date = "; cin >> date; endl;

cout << "Destination = "; cin >> destination; endl;

cout << "Prix = "; cin >> prix; endl;

}

void ticket::affichage()

{

cout << "Numero = "; num; endl;

cout << "Date = "; date; endl;

cout << "Destination = "; destination; endl;

cout << "Prix = "; prix; endl;

}

Et mon fichier test.cxx :

include "ticket.h"

void main()

{

ticket monTicket;

cout << "Avant setVal : "; endl;

monTicket.affichage();

monTicket.setVal();

monTicket.affichage();

}

Et voici ce qui est retourné par le compilateur :

antho@localhost C++]$ gcc -o test.out test.cxx ticket.cxx

Dans le fichier inclus à partir de /usr/include/c++/3.2.2/backward/stream.h:31,

à partir de ticket.h:1,

à partir de test.cxx:3:

/usr/include/c++/3.2.2/backward/backward_warning.h:32:2: AVERTISSEMENT: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the header for the <X.h> header for C++ includes, or instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.

Dans le fichier inclus à partir de /usr/include/c++/3.2.2/backward/stream.h:31,

à partir de ticket.h:1,

à partir de ticket.cxx:1:

/usr/include/c++/3.2.2/backward/backward_warning.h:32:2: AVERTISSEMENT: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the header for the <X.h> header for C++ includes, or instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.

ticket.cxx: Dans member function « void ticket::setVal() »:

ticket.cxx:13: statement ne peut résoudre l'adresse la fonction surchargée

ticket.cxx:14: statement ne peut résoudre l'adresse la fonction surchargée

ticket.cxx:15: statement ne peut résoudre l'adresse la fonction surchargée

ticket.cxx:16: statement ne peut résoudre l'adresse la fonction surchargée

ticket.cxx:17: statement ne peut résoudre l'adresse la fonction surchargée

ticket.cxx: Dans member function « void ticket::affichage() »:

ticket.cxx:22: statement ne peut résoudre l'adresse la fonction surchargée

ticket.cxx:23: statement ne peut résoudre l'adresse la fonction surchargée

ticket.cxx:24: statement ne peut résoudre l'adresse la fonction surchargée

ticket.cxx:25: statement ne peut résoudre l'adresse la fonction surchargée

ticket.cxx:26: statement ne peut résoudre l'adresse la fonction surchargée

[antho@localhost C++]$

Merci d'avance pour votre aide!

  • # Mauvais headers

    Posté par  . Évalué à 1.

    Remplace stream.h par iostream (et sans h)

    Puis ajoute

    extern "C" {
    #include <string.h>
    }

    car strcpy() une fonction de la lib C standard et pas C++.
    extern "C" aurap our effet de provoquer la recherche dans le bon répertoire et d'éviter de décorer les fonctions déclarées dans le header.

    Bon courage.
    • [^] # Re: Mauvais headers

      Posté par  . Évalué à 3.

      non mauvaise methode

      string.h est prevu pour le C++, on n'a pas a mettre de extern "C"

      par contre pour que le compilo comprenne qu'on parle de strcpy de la lib C on ecrit

      ::strcpy (xx, yy)
  • # RE

    Posté par  . Évalué à 1.

    Merci pour ta réponse qui me fait déjà bien avancer mais il y a encore un problème avec les flux :

    [antho@localhost C++]$ gcc -o test.out test.cxx ticket.cxx
    ticket.cxx: Dans member function « void ticket::setVal() »:
    ticket.cxx:13: « cout » non déclaré (première utilisation dans cette
    fonction)
    ticket.cxx:13: (Chaque identificateur non déclaré est rapporté seulement une
    seule fois pour la fonction dans laquelle il apparaît.)
    ticket.cxx:13: « cin » non déclaré (première utilisation dans cette
    fonction)
    ticket.cxx:13: « endl » non déclaré (première utilisation dans cette
    fonction)
    [antho@localhost C++]$
    • [^] # Re: RE

      Posté par  . Évalué à 3.

      Alors accessoirement:

      - Invoque gcc avec "g++" plutôt que "gcc" dans ta ligne de commande.
      - Tous les streams standard et les outils de la STL sont définis dans le namespace "std".

      Alors soit tu remplaces tous tes cout par std::cout, tes cin par std::cin , etc. , soit tu mets une fois pour toutes "using namespace std;" en début d'une nouvelle ligne juste avant la définition de ta classe.

      Bonne chance.
      • [^] # Re: RE

        Posté par  . Évalué à 1.

        Encore merci pour ta réponse mais c'est une partie du premier problème qui revient maintenant :(

        [antho@localhost C++]$ g++ -o test.out test.cxx ticket.cxx
        ticket.cxx: Dans member function « void ticket::setVal() »:
        ticket.cxx:13: statement ne peut résoudre l'adresse la fonction surchargée
        ticket.cxx:14: statement ne peut résoudre l'adresse la fonction surchargée
        ticket.cxx:15: statement ne peut résoudre l'adresse la fonction surchargée
        ticket.cxx:16: statement ne peut résoudre l'adresse la fonction surchargée
        ticket.cxx:17: statement ne peut résoudre l'adresse la fonction surchargée
        ticket.cxx: Dans member function « void ticket::affichage() »:
        ticket.cxx:22: statement ne peut résoudre l'adresse la fonction surchargée
        ticket.cxx:23: statement ne peut résoudre l'adresse la fonction surchargée
        ticket.cxx:24: statement ne peut résoudre l'adresse la fonction surchargée
        ticket.cxx:25: statement ne peut résoudre l'adresse la fonction surchargée
        ticket.cxx:26: statement ne peut résoudre l'adresse la fonction surchargée
        [antho@localhost C++]$
        • [^] # Re: RE

          Posté par  . Évalué à 2.

          Il serait peut-être temps de comprendre que tu ne fais plus de perl, mais du C++. :)

          Voila ton programme corrigé:

          #ifndef TICKET_H
          #define TICKET_H

          #include

          using namespace std;

          class ticket
          {
          private:
          int prix;
          string num;
          string date;
          string destination;

          public:
          ticket();
          void setVal();
          void affichage();
          };

          #endif /* TICKET_H */

          include
          #include

          #include "ticket.h"

          ticket::ticket()
          {
          num = "0";
          date = "0";
          destination = "0";

          prix = 0;
          }

          void ticket::setVal()
          {
          cout << "Numero = "; cin >> num; cout << endl;
          cout << "Date = "; cin >> date; cout << endl;
          cout << "Destination = "; cin >> destination; cout << endl;
          cout << "Prix = "; cin >> prix; cout << endl;
          }

          void ticket::affichage()
          {
          cout << "Numero = " << num << endl;
          cout << "Date = " << date << endl;
          cout << "Destination = " << destination << endl;
          cout << "Prix = " << prix << endl;
          }
          • [^] # Re: RE

            Posté par  . Évalué à 1.

            Flute, les includes ont été modifiés...

            - Premier include --> string (avec les crochets autours)
            - deuxième include --> iostream
            - troisième include --> string (à nouveau, peut-être pas nécessaire)
            • [^] # Re: RE

              Posté par  . Évalué à 1.

              Lol, désolé je viens du C, c'est mon premier programme en C++. :)
              Et désolé mais j'ai effectué tes modifs et le résultat est toujours le même...

              Mes fichiers :
              ticket.h :

              #ifndef TICKET_H
              #define TICKET_H

              #include
              #include
              extern "C" {
              #include <string.h>
              }
              using namespace std;

              class ticket
              {
              private:
              int prix;
              char num[10];
              char date[10];
              char destination[10];
              public:
              ticket();
              void setVal();
              void affichage();
              };
              #endif /* TICKET_H */

              ticket.cxx :

              #include "ticket.h"
              #include
              #include

              ticket::ticket()
              {
              strcpy(num,"0");
              strcpy(date,"0");
              strcpy(destination,"0");
              prix=0;
              }

              void ticket::setVal()
              {
              cout << "Numero = "; cin >> num; endl;
              cout << "Date = "; cin >> date; endl;
              cout << "Destination = "; cin >> destination; endl;
              cout << "Prix = "; cin >> prix; endl;
              cout << "test"; endl;
              }

              void ticket::affichage()
              {
              cout << "Numero = "; num; endl;
              cout << "Date = "; date; endl;
              cout << "Destination = "; destination; endl;
              cout << "Prix = "; prix; endl;
              cout << "test"; endl;
              }


              test.cxx :

              #include "ticket.h"

              void main()
              {
              ticket monTicket;

              cout << "Avant setVal : "; endl;
              monTicket.affichage();
              monTicket.setVal();
              monTicket.affichage();
              }
              • [^] # Re: RE

                Posté par  (site web personnel) . Évalué à 2.

                Relis ses modifs, je vois toujours ;endl dans ton programme...
                (Et tu as gardé les strcpy)
              • [^] # Re: RE

                Posté par  . Évalué à 1.

                Fais plutôt un copier/coller. Visiblement tu n'as pris en compte qu'une partie infime des mes modifs.
        • [^] # Re: RE

          Posté par  . Évalué à 4.

          copier-coller malheureux :

          cout << "Numero = "; cin >> num; endl;
          cout << "Date = "; cin >> date; endl;
          cout << "Destination = "; cin >> destination; endl;
          cout << "Prix = "; cin >> prix; endl;

          Les endl sont inutiles ici. Tu n'écris pas dans le stream.

          cout << "Numero = "; num; endl;
          cout << "Date = "; date; endl;
          cout << "Destination = "; destination; endl;
          cout << "Prix = "; prix ; endl;

          Ici tu devrais avoir des inserters "<<" et pas des point-virgules ! Un peu d'attention :-) Note bien que cela ne plante pas car "endl" est en fait une fonction, et que "ostream::operator <<" est déjà surchargé pour la reconnaitre.

          Tu peux très bien invoquer, en C et en C++, le symbole d'une fonction sans les parenthèses, car c'est un symbole à part entière qui représente quelque chose de bien défini: une fonction. Le symbole prend donc comme valeur l'adresse en mémoire du code de cette fonction (c'est donc un pointeur de fonction).

          Or, tu peux très bien mettre une expression qui retourne (éventuellement) une valeur sur une ligne, clotûrée par un ";". Exemples:

          5;
          cos(1);
          8+7;
          printf("Bonjour");

          Les fonctions sont des expressions au même titre que 5 ou 8+7, et qui ont une valeur. Le C/C++ appelle le code de ces fonctions pour les évaluer, et implémente de cette manière le système de sous-programme. C'est ce qui permet à printf("") de faire une action (écrire à l'écran) lorsqu'elle est évaluée.

          Or, endl est une fonction, mais surchargée, ce qui veut dire qu'il existe plusieurs versions de endl. Associé à un stream, il n'y a pas d'ambigüité, mais hors-contexte, le C++ ne sait pas laquelle choisir. D'où l'erreur !

          Ton code était donc complètement incorrect ... mais légal ! :-)

          Bienvenue dans le monde merveilleux du C++. Quand tu auras appris à en maîtriser toutes les subtilités, la puissance sera entre tes mains (personnellement, je ne code plus qu'en ASM/C/C++, avec accessoirement un peu de Shell).

          Bon courage.
    • [^] # Re: RE

      Posté par  . Évalué à 2.

      après tes includes, fait un

      using namespace std;

      en effet cout cin ... sont déclaré dans le namespace std;

      PS: Et va acheter un petit bouquin sur le C++ moderne, la STL permet de faire plein de choses sans réinventer la roue à chaque fois bon courage ;-)
      • [^] # Re: RE

        Posté par  . Évalué à 1.

        Merci pour toutes tes réponses j'y vois déjà plus clair.
        Ne tiens pas compte de mon dernier message posté, je l'ai posté avant de voir tes deux derniers messages.
        Après toutes ces modifs, une nouvelle erreur apparait :

        [antho@localhost C++]$ g++ -o test.out test.cxx ticket.cxx
        /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../crt1.o(.text+0x18): In function `_start':
        ../sysdeps/i386/elf/start.S:77: référence indéfinie vers « main »
        collect2: ld a retourné 1 code d'état d'exécution
        [antho@localhost C++]$ g++ -o test.out test.cxx ticket.cxx
        /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../crt1.o(.text+0x18): In function `_start':
        ../sysdeps/i386/elf/start.S:77: référence indéfinie vers « main »
        collect2: ld a retourné 1 code d'état d'exécution
        [antho@localhost C++]$

        :(
        • [^] # Re: RE

          Posté par  . Évalué à 1.

          Hum, c'est bizarre car cela marche chez moi.

          Avec le fichiet test.cpp suivant:

          #include < iostream >
          #include "ticket.h"

          using namespace std;

          int main()
          {
          ticket monTicket;
          cout << "Avant setVal : " << endl;
          monTicket.affichage();
          monTicket.setVal();
          monTicket.affichage();

          return 0;
          }
          • [^] # Re: RE

            Posté par  . Évalué à 1.

            Merci beaucoup!!!
            Ca fonctionne enfin, je vais pouvoir me lancer!
            Merci pour ta patience.
            A+
            • [^] # Re: RE

              Posté par  . Évalué à 1.

              Pas de quoi.... ^_^

              Mais n'oublie pas que C et C++ sont deux languages très différents (même si la syntaxe est parfois semblable), essaye de ne pas utiliser les fonctions C dans un programme C++ (et la gestion des pointeurs devrait être prohibée aussi, même si c'est totalement irréaliste en C++).

              Bon courage pour la suite.
              • [^] # Re: RE

                Posté par  . Évalué à 4.

                Ah bon la différence entre le C et le C++ c'est pas juste qu'en C++ on peut faire "i++" à la place de "i = i + 1" comme un professeur m'a dit ? ;)
              • [^] # Re: RE

                Posté par  . Évalué à 2.

                A noter que tu as corrigé son code mais pas donné la réponse:

                En C++, ta fonction main() doit forcément renvoyer un code de retour. Donc pas de void main () mais un int main ().

                Et puisque l'on parle de bon bouquin, moi je ressors - encore et toujours - celui de Christian Casteyde :

                http://casteyde.christian.free.fr/(...)

                J'ai pas trouvé mieux, personnellement. Réjouis-toi : C'est libre, c'est en FDL et c'est en français ! :-)
                • [^] # Re: RE

                  Posté par  . Évalué à 2.

                  Merci!
                  Il m'a l'air très complet ce cours.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.