Méthode récursive qui ne fait rien ? - C++ - Programmation
Marsh Posté le 03-02-2011 à 15:56:33
Citation : write(*str++); write(*buffer++); et write(s[i]); |
Tu vois bien que ça, ça écrit un unique caractère, donc il n'y a pas appel récursif.
Par contre, vu qu'il y a pas de méthode write dans stdlib.h, stdio.h, string.h, math.h au mieux, elle est définie dans wiring.h (c'était pas writing.h?) ou Print.h
Bon déjà a la base, l'en tête
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
Ça devrait être:
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
plutôt qu'une syntaxe C antique
Edit: Un coup de google et j'ai trouvé le source.
write est définie Print.h comme méthode de la classe:
virtual void write(uint8_t) = 0;
A+,
Marsh Posté le 03-02-2011 à 16:19:50
gilou a écrit :
Tu vois bien que ça, ça écrit un unique caractère, donc il n'y a pas appel récursif. |
Merci pour ta réponse
J'avais commencé une grosse tartine pour te répondre, mais je viens de voir ton edit
Merci, c'est cool, je vais regarder ça !
EDIT : Bon, en fait je comprends toujours pas, mais là c'est parce que mes connaissances en C++ sont miteuses... Je vais me replonger dedans.
Marsh Posté le 03-02-2011 à 16:39:30
gilou a écrit : Bon déjà a la base, l'en tête |
J'ai tendance a preferer la forme xxx.h a la forme cxxx. En pratique, la forme cxxx ne respecte pas toujours toutes les contraintes de la norme (cad les noms sont aussi defini dans l'espace global; c'est un probleme fondamental pour certaines implementation, au point que C++0X a relache les contraintes sur la forme cxxx). Et sous Unix les choses supplementaires qui se trouvent dans les entetes xxx.h ne se trouve parfois pas avec la forme cxxx, meme quand les features macros necessaires sont bien definies (si j'ai bonne memoire Solaris et AIX etaient toujours dans ce cas la derniere fois que j'ai verifie).
Marsh Posté le 03-02-2011 à 17:11:49
Pour l'entête, je pense que c'est parce que le code est dédié à du hardware spécial (un micro-contrôleur Arduino) qui n'accepte peut-être pas la syntaxe Cxxx.
Bon sinon, juste pour info, si je parlais de récursivité, c'est parce que, comme je ne me rappelle plus de rien en C++, j'interprète comme en C. Donc ce code :
Code :
|
je le lis comme une fonction "write" qui s'appelle elle-même, jusqu'à la fin de la chaine, mais qui ne fait rien d'autre.
Du coup j'arrive pas à savoir à quoi correspond le "write" dans le corps de la classe, et où je peux trouver le code correspondant de cette fonction (si c'en est une, ce dont je ne suis toujours pas sûr )
Marsh Posté le 03-02-2011 à 17:48:39
Un Programmeur a écrit : |
C'est un peu le but justement: tenter de voir si on ne dépend pas de trop de choses supplémentaires. Bon après, ça dépend de ses besoins.
A+,
Marsh Posté le 03-02-2011 à 17:54:53
Turkleton a écrit : Pour l'entête, je pense que c'est parce que le code est dédié à du hardware spécial (un micro-contrôleur Arduino) qui n'accepte peut-être pas la syntaxe Cxxx.
je le lis comme une fonction "write" qui s'appelle elle-même, jusqu'à la fin de la chaine, mais qui ne fait rien d'autre. |
Non:
void Print::write(const char *str) appelle ici void Print::write(uint8_t char);
La première a une chaine C en argument, et la seconde un seul caractère.
write(*str++); comme str est une chaine, *str est un caractère (le ++ n'entre pas en compte ici)
Bon, la seconde, void Print::write(uint8_t char), étant définie comme: virtuel void Print::write(uint8_t char)=0; (méthode purement virtuelle) cela implique qu'elle n'existe pas vraiment en tant que telle mais existe comme prototype devant obligatoirement être implémente par les classes dérivées (et implique aussi que Print devra avoir des classes dérivées par lesquelles on passera).
A+,
Marsh Posté le 03-02-2011 à 18:21:32
gilou a écrit : Non: |
Ha d'accord, ça y est j'ai capté
Donc effectivement, je pouvais toujours chercher, si c'est pas (encore) implémenté à ce stade, j'aurais jamais trouvé... Et je n'avais pas compris dans ton premier post qu'elle ne s'appelait pas elle-même car le paramètre passé n'était pas une chaine mais un caractère, à la relecture c'est pourtant bien ce que tu disais.
Bon, par contre, les classes dérivées, j'en venais justement, et c'est pour ça que je suis arrivé jusqu'à celle-ci parce que je ne trouvais pas l'implémentation de cette méthode dans la librairie que j'étais en train d'analyser. Pas grave, c'était surtout pour satisfaire ma curiosité, je vais pas chercher à comprendre en détails non plus (parce que si le C++ est déjà loin dans ma mémoire, l'assembleur... ).
Merci Gilou
Marsh Posté le 03-02-2011 à 15:31:18
Bonjour à tous, désolé si la question vous parait con, mes cours de C++ datent de y'a longtemps...
Voici une classe :
Alors autant je comprends que quand on utilise la méthode "print", il décompose suivant le type du paramètre et il utilise la méthode "write" qui est plus bas-niveau, autant je comprends pas la méthode "write" elle-même, qui s'appelle récursivement mais qui ne fait rien d'autre
Ou alors c'est une méthode héritée d'une autre classe ? (je crois pas qu'il y ait une fonction "write" de base en C++ ?)
Ou alors je dis n'importe quoi, c'est possible aussi
---------------
If you think it could look good, then I guess it should