Méthode récursive qui ne fait rien ?

Méthode récursive qui ne fait rien ? - C++ - Programmation

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... [:implosion de carla:2]  
 
Voici une classe :
 

Code :
  1. /*
  2. Print.cpp - Base class that provides print() and println()
  3. Copyright (c) 2008 David A. Mellis.  All right reserved.
  4. .........
  5. */
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <math.h>
  10. #include "wiring.h"
  11. #include "Print.h"
  12. // Public Methods //////////////////////////////////////////////////////////////
  13. /* default implementation: may be overridden */
  14. void Print::write(const char *str)
  15. {
  16.   while (*str)
  17.     write(*str++);
  18. }
  19. /* default implementation: may be overridden */
  20. void Print::write(const uint8_t *buffer, size_t size)
  21. {
  22.   while (size--)
  23.     write(*buffer++);
  24. }
  25. void Print::print(const String &s)
  26. {
  27.   for (int i = 0; i < s.length(); i++) {
  28.     write(s[i]);
  29.   }
  30. }
  31. void Print::print(const char str[])
  32. {
  33.   write(str);
  34. }
  35. //............. la suite étant d'autres "print" avec d'autres types en entrée


 
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 :sweat:


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 03-02-2011 à 15:31:18   

Reply

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+,

Message cité 2 fois
Message édité par gilou le 03-02-2011 à 16:11:12

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-02-2011 à 16:19:50    

gilou a écrit :

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+,

Merci pour ta réponse :jap:  
 
J'avais commencé une grosse tartine pour te répondre, mais je viens de voir ton edit :D  
 
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.


Message édité par Turkleton le 03-02-2011 à 16:23:56

---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 03-02-2011 à 16:39:30    

gilou a écrit :

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


 
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).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

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 :
  1. void Print::write(const char *str)
  2. {
  3.   while (*str)
  4.     write(*str++);
  5. }

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 :pt1cable: )


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 03-02-2011 à 17:48:39    

Un Programmeur a écrit :


 
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).

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+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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.
 
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 :
  1. void Print::write(const char *str)
  2. {
  3.   while (*str)
  4.     write(*str++);
  5. }

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 :pt1cable: )

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+,

Message cité 1 fois
Message édité par gilou le 03-02-2011 à 17:59:41

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-02-2011 à 18:21:32    

gilou a écrit :

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+,

Ha d'accord, ça y est j'ai capté :jap:  
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... :whistle: ).
 
Merci Gilou


---------------
If you think it could look good, then I guess it should
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed