String class en C++
J.T.
-
Jolkdarr -
Jolkdarr -
Bonjour,
Voila c un probleme de conversion en C++.
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
et la je ne recupere pas la valeur souhaite dans _y. Qqn pourrait m'aider ... merci!
J.T.
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.
A voir également:
- String class en C++
- Nvcontainer windows class - Forum Javascript
- Nvcontainer window class - Forum Virus
- Realtek audio background process class ✓ - Forum Pilotes (drivers)
- Ajoutez à la liste de contacts ana le goff, inscrite le 27 novembre 2015, dans la catégorie i. puis triez les contacts en les classant : par ordre alphabétique de leur nom de famille (critère principal), puis par date du plus récent au plus ancien (critère secondaire). quel mot apparaît à la verticale dans la colonne "catégorie" entre les lignes 200 et 209 (en-tête compris) ? ✓ - Forum Word
- Input string was not in a correct format traduction - Forum Virus
20 réponses
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
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
Counter module:
Dans mon main module: _llcountin est de type Counter
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.
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.
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.
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.
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
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
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;
Valeur de _count ?
Après :
const char*_count = _llcountin->read_handler(this, H_BYTE_COUNT).c_str();
rajouter :
cout << (unsigned long) _count << endl;
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)
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)
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.
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.
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...
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...
ç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().
Essaie de rajouter :
return String("45") + "\n";
à la fin de la fonction membre read_handler().
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.
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.
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:
et moi ce que je fais c'est:
encore une fois merci, je ne pensais pas que l'erreur se situait a ce point la.
J.T.
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.
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:
Merci !!!
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 !!!
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"
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"
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.
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);
...
// 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);
...