OVH Cloud OVH Cloud

problème de déclaration

5 réponses
Avatar
Laurent B
Bonjour , je tiens a m'escuser car les questions que je vais poser sont
celles d'un noob .

J'ai une fonction dont voici l'entete :

void recherche(char c_nom,char c_prenom,char c_cp,char c_ville,char
c_tel,char c_fonction,ListeContact nom_liste, int tab[500]);

j'ai 2 pb :
1) le tableau contient 500 adresses ( pointeur ) d'une classe appele
ListeContact. Est-ce qu'il ne serais pas mieux de déclarer comme ca :
void recherche(char c_nom,char c_prenom,char c_cp,char c_ville,char
c_tel,char c_fonction,ListeContact nom_liste, *ListeContact tab[500]);
?

2) j'ai envie de faire un test de ce prog , donc je vais devoir créer 1
variable ListeContact et un tableau .
j'ai donc ecrit avant de lance le prog dans mon main :

ListeContact L ;
int Tab[500] ;
recherche("e","e","e","e","e","e",L,tab);

ca me met :
C:\proget c++\test.cpp(10) : error C2065: 'recherche' : undeclared
identifier
Error executing cl.exe
c'est quoi cette erreur ?

merci

Laurent

5 réponses

Avatar
fabrizio
void recherche(char c_nom,char c_prenom,char c_cp,char c_ville,char
c_tel,char c_fonction,ListeContact nom_liste, int tab[500]);

j'ai 2 pb :
1) le tableau contient 500 adresses ( pointeur ) d'une classe appele
ListeContact. Est-ce qu'il ne serais pas mieux de déclarer comme ca :
void recherche(char c_nom,char c_prenom,char c_cp,char c_ville,char
c_tel,char c_fonction,ListeContact nom_liste, *ListeContact tab[500]);
?


AMHA, tu devrais faire un truc dans ce style :
void recherche(struct parametre* Liste)
ou
void recherche(struct parametre* Liste[])
avec :
struct parametre {
char* c_nom;
char* c_prenom;
....
}

les parametres de fonctions sont transférés sur la pile.
mieux éviter de la surchargé inutilement.

2) j'ai envie de faire un test de ce prog , donc je vais devoir créer 1
variable ListeContact et un tableau .
j'ai donc ecrit avant de lance le prog dans mon main :

ListeContact L ;
int Tab[500] ;
recherche("e","e","e","e","e","e",L,tab);

ca me met :
C:proget c++test.cpp(10) : error C2065: 'recherche' : undeclared
identifier
Error executing cl.exe
c'est quoi cette erreur ?


je ne sais pas exactement mais tes 'char' sont plutot des char*.
un char c'est un chiffre (sur 8 bits).
un char* c'est un pointeur sur une chaine de caractères.

bon courage

Avatar
Olivier Azeau
Laurent B wrote:
Bonjour , je tiens a m'escuser car les questions que je vais poser sont
celles d'un noob .

J'ai une fonction dont voici l'entete :

void recherche(char c_nom,char c_prenom,char c_cp,char c_ville,char
c_tel,char c_fonction,ListeContact nom_liste, int tab[500]);

j'ai 2 pb :
1) le tableau contient 500 adresses ( pointeur ) d'une classe appele
ListeContact. Est-ce qu'il ne serais pas mieux de déclarer comme ca :
void recherche(char c_nom,char c_prenom,char c_cp,char c_ville,char
c_tel,char c_fonction,ListeContact nom_liste, *ListeContact tab[500]);
?


Avant de te préoccuper des problèmes de syntaxe déclarative, il me
semble beaucoup plus urgent de découper ton problème sous forme de
classes et/ou structures. Quelque chose comme (si j'ai bien compris ce
qu'est censée faire ta fonction recherche) :

struct CriteresDeRecherche {
std::string nom;
std::string prenom;
};

struct Contact {
std::string nom;
std::string prenom;
};

struct ListeDeContacts {
Contact recherche( CriteresDeRecherche lesCriteres );
Contact tousLesContacts[500];
};

Avatar
kanze
Laurent B wrote:

J'ai une fonction dont voici l'entete :

void recherche(char c_nom,char c_prenom,char c_cp,char c_ville,char
c_tel,char c_fonction,ListeContact nom_liste, int tab[500]);

j'ai 2 pb :

1) le tableau contient 500 adresses ( pointeur ) d'une classe
appele ListeContact.


Quel tableau ? Le seul tableau que je vois ici, c'est « int
tab[500] ». Et en fait, il y a une transformation automatique
qui converit ça en « int *tab ».

Est-ce qu'il ne serais pas mieux de déclarer comme ca :

void recherche(char c_nom,char c_prenom,char c_cp,char c_ville,char
c_tel,char c_fonction,ListeContact nom_liste, *ListeContact
tab[500]);

?


Ça dépend de ce que tu veux. Ce n'est pas la même chose.

En fait, ce que tu as écrit n'est même pas du C++. Je suppose
que le dernier paramètre doit être ListeContact* tab[ 500 ] --
tu veux en fait passer un tableau de 500 pointeurs, mais le
compilateur le convertit implicitement en pointeur au premier
élément.

2) j'ai envie de faire un test de ce prog , donc je vais devoir
créer 1

variable ListeContact et un tableau .
j'ai donc ecrit avant de lance le prog dans mon main :

ListeContact L ;
int Tab[500] ;
recherche("e","e","e","e","e","e",L,tab);

ca me met :
C:proget c++test.cpp(10) : error C2065: 'recherche' : undeclared
identifier


Là, il faudrait voir où tu as déclaré quoi.

Je ne connais pas l'équivalent en français, mais en américain,
je dirais « you've bitten off more than you can chew ». Avant de
s'attaquer à ton programme, il faut que tu apprends un minimum
de C++ ; essayer d'écrire quelque chose sans connaître la
moindre chose du langage, et d'apprendre le langage en posant
les questions sur les erreurs qui y apparaissent, ne marchera
pas.

J'ai aussi l'impression (mais c'est moins certaine) qu'il te
manque des connaissances plus général dans la programmation :
des choses comme la conception orientée objet ou des structures
de données et des algorithmes.

Enfin, en jouant un peu au dévin : ListeContact d'après le nom
est une liste (ou un tableau -- la structure de données importe
peu pour l'instant) des Contact. La fonction recherche doit
trouver un élément dans cette liste, selon un critère que je
connais pas, et renvoyer les attributes de ce Contact dans des
variables différentes. Je suppose qu'en fait, ton intention,
c'est que c_nom, c_prenom, etc. doivent être des std::string&,
c-à-d que ce sont des paramètres de sortie, et qu'ils sont des
paramètres de type chaîne de caractère. Mais je le suppose un
peu d'après les noms, et de ce que j'imagine peut faire une
fonction nommée recherche, parce que ce n'est pas du tout ce que
tu as écris. Dans ce cas, la solution classique, c'est de
renvoyer un Contact, et non les éléments séparés. Ou un
Contact*, qui pourrait être NULL si on n'a pas trouvé l'élément.
Je verrais donc quelque chose du genre :

class ListeContact
{
public:
Contact const* recherche( std::string const& nom ) const ;
// J'ai supposé ici qu'on veut réchercher sur le
// nom.

private:
typedef std::vector< Contact >
Liste ;
Liste mesDonnees ;
} ;

class NameMatcher
{
public:
NameMatcher( std::string const& name )
: myName( name )
{
}
bool operator()( Contact const& contact ) const
{
return myName == contact.getName() ;
}

private:
std::string myName ;
} ;

Contact const*
ListeContact::recherche( std::string const& nom ) const
{
List::const_iterator result
= std::find_if( mesDonnees.begin(), mesDonnees.end(),
NameMatcher( nom ) ) ;
return result == mesDonnees.end()
? NULL
: &*result ;
}

À mon avis, du code comme ceci est tout à fait à la portée d'un
débuttant en C++, mais il faut quand même qu'il connaisse un peu
les bases du langage. Je ne l'ai pas vu moi-même, mais d'après
ce que j'entends dire, un livre comme « Accelerated C++ :
Practical Programming by Example » t'y amenera assez vite.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
kanze
Olivier Azeau wrote:
Laurent B wrote:

J'ai une fonction dont voici l'entete :

void recherche(char c_nom,char c_prenom,char c_cp,char c_ville,char

c_tel,char c_fonction,ListeContact nom_liste, int tab[500]);

j'ai 2 pb :
1) le tableau contient 500 adresses ( pointeur ) d'une
classe appele ListeContact. Est-ce qu'il ne serais pas mieux
de déclarer comme ca : void recherche(char c_nom,char
c_prenom,char c_cp,char c_ville,char c_tel,char
c_fonction,ListeContact nom_liste, *ListeContact tab[500]);
?


Avant de te préoccuper des problèmes de syntaxe déclarative,
il me semble beaucoup plus urgent de découper ton problème
sous forme de classes et/ou structures. Quelque chose comme
(si j'ai bien compris ce qu'est censée faire ta fonction
recherche) :

struct CriteresDeRecherche {
std::string nom;
std::string prenom;
};


Il faudrait d'abord savoir réelement sur quoi il veut faire la
récherche. Je pourrais imaginer quelque chose du genre :

! struct CriteresDeRecherche
! {
! boost::regex nom ;
! boost::regex prenom ;
! // ...
! } ;

avec comme valeur pour par défaut pour des champs non
positionnées ".*", et avec une fonction matches :

! bool CriteresDeRecherche::matches(
! Contact const& obj )
! {
! return regex_match( obj.nom, nom )
! && regex_match( obj.prenom, prenom )
! // ...
! ;
! }

Mais je crois qu'il n'en est pas encore là.

(En passant, est-ce qu'un des gourous des templates saurait en
faire un template du genre :

! template< typename T >
! class CriteresDeRecherche // ???

où j'instancierais sur Contact, pour avoir quelque chose comme
ci-dessus ; c-à-d des mêmes membres de données, mais avec un
regex à la place d'une chaîne, et une fonctoin match qui
s'enchaîne des regex_match.)

Un autre alternatif, évidemment, serait un enum FieldId et un
std::map< FieldId, std::string >, avec un std::map< FieldId,
boost::regex > pour les critères de recherche. Voire
éventuellement même l'utilisation d'un std::string comme FieldId
(intéressant dans le cas d'une application GUI, parce qu'il
permet à l'utilisateur à définir de nouveaux champs, qu'on peut
présenter dans une liste de façon à éviter les fautes
d'orthographe).

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
drkm
writes:

! struct CriteresDeRecherche
! {
! boost::regex nom ;
! boost::regex prenom ;
! // ...
! } ;


Bonne idée, les "!" en début de ligne. Le code non-indenté que
produisait Google Groups était pénible à lire. Merci.

--drkm