Erreur incomprehensible (pour moi)

Lya -  
mamiemando Messages postés 34243 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour
Je corrige des erreurs de compilation depuis plus d'1 heure et je suis en train de devenir dingue!!!!
et ça fait près d'un quart d'heure que je suis sur celle-ci (la dernière!) Aidez-moi s'il-vous-plaît.

Voici l'erreur signaler par le compilateur (je compile sous Eclipse):

undefined reference to `ecrireD(std::basic_ostream<char, std::char_traits<char> >&, Date const&)' IdMessage.cpp ligne 23

Et voici le programme:

#include "IdMessage.h"

using namespace std;

void lireId (istream& is, IdMessage& id){
is >> id.exp;
is >> id.dest;
lireD(is, id.d);
lireH(is, id.h);
}

void ecrireId (ostream& os, const IdMessage& id){
os << " " << id.exp << " ";
os << id.dest << " ";
ecrireD (os, id.d); //l'erreur est signalée là
ecrireH (os, id.h);
}

#ifndef IDMESSAGE_H_
#define IDMESSAGE_H_

/**
* @brief Type IdMessage
*/

#include "Date.h"
#include "Heure.h"

struct IdMessage{
char* exp;//NPO dimensionner
char* dest;//NPO dimensionner
Date d; //date d'envoi du message
Heure h; //heure d'envoi du message
};

/**
* @brief lire la variable id à partir d'un flot d'entrée
* @param [in,out] is : le flot d'entree
* @pre Le flot est en état d'être lu.
*/
void lireId (std::istream& is, IdMessage& id);

/**
* @brief écrire la variable id dans un flot de sortie ouvert
* @param [in,out] os : le flot de sortie
* @param [in] id : la variable à écrire
* @pre Le flot est en état d'être écrit.
*/
void ecrireId (std::ostream& os, const IdMessage& id);

#endif /*IDMESSAGE_H_*/

#ifndef DATE_H_
#define DATE_H_

#include <iostream>
#include <cassert>

/**
* @brief Type Date
* invariant : la date doit être valide
*/
struct Date {
unsigned short jour;
unsigned short mois;
unsigned long annee;
};

/**
* @brief lire une date à partir d'un flot
* @param [in,out] is : le flot d'entree
* @pre Le flot est en état d'être lu.
*/
void lireD (std::istream& is, Date& d);

/**
* @brief écrire une date dans un flot de sortie ouvert
* @param [in,out] os : le flot de sortie
* @param [in] d : la date à écrire
* @pre Le flot est en état d'être écrit.
*/
void ecrireD (std::ostream& os, const Date& d);

#endif /*DATE_H_*/

#include <iostream>
#include <fstream>
#include "Date.h"

using namespace std;

void lireD (istream& is, Date& d){
is >> d.jour;
is >> d.mois;
is >> d.annee;
}

void ecrireD (ostream& os, Date& d){
os << " " << d.jour << "/";
os << d.mois << "/";
os << d.annee << " ";
}

merci beaucoup pour votre aide. je serais éternellement (enfin une petite éternité ) à quiconque m'empêcheras de sombrer dans la folie!

PS ça fait un peu mélodramatique à la relecture désolé. ^^

1 réponse

mamiemando Messages postés 34243 Date d'inscription   Statut Modérateur Dernière intervention   7 898
 
Pour une raison mystérieuse tu as juste déclaré le prototype de la fonction que tu appelles :
void ecrireD (std::ostream& os, const Date& d); 

... et ce bien après son appel (ligne 23). Si tu avais écrit le prototype avant il aurait fait une erreur de linkage, mais là il plante encore avant car pour lui, la fonction n'est même pas déclarée à ce stade.

Bonne chance
0