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 Obsidian . Évalué à 1.
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 kesako . Évalué à 3.
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 Mookie . Évalué à 1.
[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 Obsidian . Évalué à 3.
- 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 Mookie . Évalué à 1.
[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 Alan_T . Évalué à 2.
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 Alan_T . Évalué à 1.
- 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 Mookie . Évalué à 1.
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 Pascal Terjan (site web personnel) . Évalué à 2.
(Et tu as gardé les strcpy)
[^] # Re: RE
Posté par Alan_T . Évalué à 1.
[^] # Re: RE
Posté par Obsidian . Évalué à 4.
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 schyzomarijks . Évalué à 2.
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 Mookie . Évalué à 1.
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 Alan_T . Évalué à 1.
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 Mookie . Évalué à 1.
Ca fonctionne enfin, je vais pouvoir me lancer!
Merci pour ta patience.
A+
[^] # Re: RE
Posté par Alan_T . Évalué à 1.
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 durandal . Évalué à 4.
[^] # Re: RE
Posté par Obsidian . Évalué à 2.
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 Mookie . Évalué à 2.
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.