String class en C++

Fermé
J.T. - 19 août 2004 à 18:30
 Jolkdarr - 19 août 2004 à 22:21
Bonjour,

Voila c un probleme de conversion en C++.

 
String 
mon_element::ma_methode(Element *, void *)
{
mon_element *e = (Element *)e
...
return String(e->_x) + "\n";
}


Dans un autre module j'essaie d'obtenir la valeur numerique qu'est cense me renvoyer ma_methode.
voila ce que je fais:
_e est de type mon_element

const char* _y = (_e->ma_methode(this, _h)).c_str();


et la je ne recupere pas la valeur souhaite dans _y. Qqn pourrait m'aider ... merci!

J.T.

20 réponses

Hello !

Peux-tu mettre un petit programme (main + classe) montrant clairement le problème ?
0
Bonjour,

J'en suis même à mes premiers pas en ce qui a trait aux classes et au polimorphisme alors je ne suis pas sur de tout comprendre mais voici quelques idées.

Lors de la déclaration du prototype de fonction de votre fonction, avez déclaré le prototype en "virtual" ?

De plus je ne vois pas l'élément dans la définition des paramètres, lors de la déclaration, c'est OK de ne pas mettre l'élément et seulement le type, mais lors de la définition, il me semble que l'élément devrait y figurer.

Bon, peut-être quelqu'un pourra confirmer ou dénier ceci!

Lupin
0
Counter module:
String
Counter::read_handler(Element *e, void *thunk)
{
Counter *c = (Counter *)e;
switch ((intptr_t)thunk) {
case H_BYTE_COUNT:
return String(c->_byte_count) + "\n";
..
}
}

Dans mon main module: _llcountin est de type Counter
intptr H_BYTE_COUNT;
const char*_count = _llcountin->read_handler(this, H_BYTE_COUNT).c_str();
u_long _lcount=strtoul(_count, NULL, 0);
...


je recupere un objet string depuis read_handler et au final je veux obtenir _lcount comme un u_long, c'est pour ca que j'utilise strtoul.
Merci d'avance.

J.T.
0
re :

Ici dans la déclaration, je vois bien les éléments dans les paramètrs, toutefois avez déclaré la méthode _byte_count comme fonction virtuel ?

Lupin
0
Tu peux indiquer ce que tu obtiens et ce que tu attends ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dans counter.hh _byte_count est declare. Il n'y a pas de probleme la dessus.
En fait llcountin est cense compter le nombre de bytes recu par le noeud.
Dans le cas ou le noeud ne recoit rien, _count devrait etre egal a 0 et ce que j'obtiens est: -803452520 et ce nombre varie meme si je ne recois rien.
_lcount est egal a 0 parce que strtoul renvoie 0 a cause du moins dans _count.
Je peux controler le counter de facon externe, la valeur reste constante et egal a 0.
Encore une fois merci!

J.T.
0
Utilisateur anonyme
19 août 2004 à 20:17
re :

Pour ma part, je n'ai pas cette librairie sur mon poste, voici donc un exemple de déclaration de fonction virtuel permettant le liage dynamique.

// Fonction virtuelle pure ou non produisant la classe
// de base abstraite Employe.

virtual double gains() const = 0; // Fonction virtuel pure
virtual void affichage() const; // Fonction virtuel non pure

Lupin
0
Encore des questions :

Valeur de _count ?

Après :
const char*_count = _llcountin->read_handler(this, H_BYTE_COUNT).c_str();

rajouter :
cout << (unsigned long) _count << endl;
0
Test à faire :

Remplacer :

const char*_count = _llcountin->read_handler(this, H_BYTE_COUNT).c_str();
u_long _lcount=strtoul(_count, NULL, 0);

par


u_long _lcount=strtoul(_llcountin->read_handler(this, H_BYTE_COUNT).c_str(), NULL, 0);

Qu'est-ce que ça donne ? (j'attends la réponse)
0
Merci encore pour ta reponse.
G remplace la partie du code par ce que tu m'as dit mais le resultat est le meme.
je precise que lq valeur de _count c celle que je donnais tout a l'heure: -huit cent mille et des pousieres...
la fonction read_handler renvoie un objet String avec un retour chariot. c_str() est cense renvoyer une chaine de caracteres sans retour chariot non?!
Merci emcore!

J.T.
0
OK.
OK.
On sait maintenant que le problème ne se situe pas à la fin.

c_str renvoie un pointeur de type const char* pour manipuler un objet string comme une chaine C.

Essaie de rajouter avant ton return (que tu peux laisser tel quel) :
return String("45") + "\n";
return String(e->_x) + "\n";

Pour valider l'utilisation de ta fonction membre.

J'attends la réponse...
0
En ajoutant 45 j'obtiens toujours un truc bizarre du genre : -843140320.
0
ça veut dire que tu ne passes pas dans le cas correct au niveau du switch.
Essaie de rajouter :

return String("45") + "\n";

à la fin de la fonction membre read_handler().
0
Dans le module main :

intptr H_BYTE_COUNT;
const char*_count = _llcountin->read_handler(this, H_BYTE_COUNT).c_str();
u_long _lcount=strtoul(_count, NULL, 0);
...

Ne pas déclarer H_BYTE_COUNT mais inclure le fichier où se trouve sa définition.
0
Good call!
j'ai rajoute le 45 a l'exterieur du switch et effactivement je recupere 45 alors qu'a l'interieur du switch cela n'apparait pas.
Est ce que tu aurais une idee de comment appeler la fonction membre de facon correcte.
Voila le code:
enum {H_COUNT, H_BYTE_COUNT, ...}

String
Counter::read_handler(Element *e, void *thunk)
{
Counter *c = (Counter *)e;
switch ((intptr_t)thunk) {
case H_BYTE_COUNT:
return String(c->_byte_count) + "\n";
..
}
}


et moi ce que je fais c'est:

intptr_t H_BYTE_COUNT;
const char*_count = _llcountin->read_handler(this, H_BYTE_COUNT).c_str();
u_long _lcount=strtoul(_count, NULL, 0);
...


encore une fois merci, je ne pensais pas que l'erreur se situait a ce point la.

J.T.
0
Si j'ajoute l'include vers le fichier ou est defini H_BYTE_COUNT, j'obtiens une erreur a la compilation:
no matching function for call to 'Counter::read_handler(Counter*&, <anonymous enum>)'
avec:
const char*_count = _llcountin->read_handler(_llcountin ,H_BYTE_COUNT).c_str();

Merci !!!
0
La définition du type énuméré n'a pas de nom.
Pourquoi ne pas passer un int à la place ?

String
Counter::read_handler(Element *e, int thunk);

Surtout ne pas passer un int non initialisé comme tu l'as fait :
Remplacer
intptr_t H_BYTE_COUNT
par l'inclusion du fichier qui va bien :
#include "fichier où se trouve la définition du H_BYTE_COUNT"
0
Que le compilateur râle, ce n'est pas étonnant. Il ne sait pas convertir un énuméré en "void*". En revanche, enum -> int, il sait faire.
0
En résumé, faudrait essayer :

// fichier "toto.h" :
enum {H_COUNT, H_BYTE_COUNT, ...}

------------------------------------

String
Counter::read_handler(Element *e, int thunk)
{
Counter *c = (Counter *)e;
switch (thunk) {
case H_BYTE_COUNT:
return String(c->_byte_count) + "\n";
..
}
}

-----------------------------------------

const char*_count = _llcountin->read_handler(this, H_BYTE_COUNT).c_str();
u_long _lcount=strtoul(_count, NULL, 0);
...
0
Bon ben franchement je te remercie! ca marche!
je voulais pas toucher au module Counter parce qu'il est utilise par pas mal de monde mais bon finalement je leur ferai un package avec un nouveau module.
Merci bcp encore une fois pour avoir pris le temps de m'aider!

J.T.
0
OK.
Bonne continuation... ;)
0