Creer des listes d'ojets et se les passer entres fonctions

Creer des listes d'ojets et se les passer entres fonctions - C++ - Programmation

Marsh Posté le 05-06-2010 à 01:01:18    

Salut,
 
Je m'essaye au C++ avec un microcontrolleur, sur une carte arduino. Je voudrais créer une liste d'objet dans un fonction puis me resservir de cette liste dans une autre méthode. J'ai vu sur d'autre forum que mon code ne pouvait pas marcher parce que l'objet n'était valide que dans le scope où il est crée. Mais comment peut on faire pour le faire sortir ?
 
Le "new" n'est pas disponible dans ce langage. J'essaye avec ou sans malloc() ça change rien. Ce code n'est pas important, c'est un exemple mais en fait je voudrais communiquer à la carte au démarrage des objets qui peuvent être en nombre important et que je ne peux pas mettre en dur dans le code.
 

Code :
  1. class Animal
  2. {
  3. protected :
  4.   int _num ;
  5. public :
  6.   Animal(){
  7.   }
  8.   Animal( int num )
  9.   {
  10.     _num = num ;
  11.   }
  12.   virtual void parle() const=0 ;
  13. };
  14. class Chien :
  15. public Animal
  16. {
  17. public :
  18.   Chien( int num ):
  19.   Animal( num )
  20.   {
  21.   }
  22.   virtual void parle() const
  23.   {
  24.     Serial.println("wouarf" );
  25.   }
  26. };
  27. class Chat :
  28. public Animal
  29. {
  30. public :
  31.   Chat( int num ):
  32.   Animal( num )
  33.   {
  34.   }
  35.   virtual void parle() const
  36.   {
  37.     Serial.println("miaou" );
  38.   }
  39. };
  40. class Menagerie
  41. {
  42. private :
  43.   int _nbBetes ;
  44.   Animal * poly[20];
  45. public :
  46.   Menagerie()
  47.   {
  48.     _nbBetes = 0 ;
  49.   }
  50.   void addChat(int num)
  51.   {
  52.     // poly[_nbBetes++] = &Chat(num);
  53.     poly[_nbBetes++] = (Chat*)malloc( sizeof(Chat));
  54.  
  55.   }
  56.   void addChien( int num )
  57.   {
  58.     poly[_nbBetes++] = &Chien(num);
  59.   }
  60.   void faitParler()
  61.   {
  62.     Serial.print( "nbBetes = " );
  63.     Serial.println( _nbBetes );
  64.    
  65.     for( int i = 0 ; i < _nbBetes ; i++ )
  66.     {
  67.       poly[i]->parle();
  68.       delay( 1000 );
  69.     }
  70.   }
  71. };
  72. Menagerie *mesAnimaux = (Menagerie*)malloc( sizeof(Menagerie));
  73. void setup()
  74. {
  75.   Serial.begin(9600);
  76. }
  77. int etat = 0 ;
  78. void loop()
  79. {
  80.   Serial.println( millis() );
  81.   switch( etat )
  82.   {
  83.   case 0 :
  84.     mesAnimaux->addChat(3);
  85.     mesAnimaux->addChien(7);
  86.    
  87.     etat++ ;
  88.     break ;
  89.   case 1 :
  90.     mesAnimaux->faitParler();
  91.     break ;
  92.   }
  93. }


Message édité par Ricco le 05-06-2010 à 01:01:46

---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
Reply

Marsh Posté le 05-06-2010 à 01:01:18   

Reply

Marsh Posté le 05-06-2010 à 12:08:12    

Ton camarade de promo a apparement deja posé la question là:

 

http://www.developpez.net/forums/d [...] ets-scope/

 

et faire de l'objet avec seulement des malloc , c'ets allez au devant de grave déssilusion.
Utilis ele new de placement sur de l'espace mémoire préalloué et passe des références si tu veux partager les instances entre méthdoe ou fonctions


Message édité par Joel F le 05-06-2010 à 12:10:19
Reply

Marsh Posté le 05-06-2010 à 14:22:46    

C'est gentils de me rajeunir mais ils ne s'agit pas d'exo. J'ai réécris format exercice pour que ça puisse être clair et réutilisable ... Je pense que tu t'en tamponne de la lecture analogique ou de la détection d'impulsion.
 
Sinon mon multi et moi tentons d'autre forum, on ne peut rien te cacher ...
 
Comme je disais le compilateur ne supporte pas le mot clé new, et dans la communauté le palliatif semble être de le remplacer par un malloc.  
Je pensais que c'était équivalent.
 
Bon, au final je sens que je vais devoir préalouer des tableaux, faire sauter le polymorphisme et me contenter du minimum de type d'objet différents.
 
Mais rassurer moi, en C avec des "new" c'est possible de passer des objets d'une méthode dans un attribue  ?


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
Reply

Marsh Posté le 05-06-2010 à 17:25:37    

y a pas de methode en "C" surtout.
 
Si tes classes sont justes des sacs à variables et n'ont pas de constructeur compliqué, malloc suffit. Ensuite trimballe tes pointeurs ou tes références.
 
new n'existe pas ou est couteux ? car le new de placement comme je l'ai indiqué dans l'autre topic peut t'aider je pense.

Reply

Marsh Posté le 05-06-2010 à 19:36:27    

Ah ok je n'avais pas fait le lien.  
 
Le new créer une erreur à la compilation. Tout comme j'avais essayé de copier coller bêtement ton code pour voir et les std:: ne passaient pas. Je pense pas que les pointeurs intelligent, si c'est bien ça, ne sont pas gérés.
 
Je vais essayer de simplifier mon code et rester dans les bornes de l'environnement de dev dédié à l'arduino.


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
Reply

Marsh Posté le 05-06-2010 à 20:06:17    

c'est pas des pointeurs intelligent, juste des pointeurs :€

 

quelle erreur te donne le new  ?
C++ sans new, c'ets du C :/


Message édité par Joel F le 05-06-2010 à 20:06:37
Reply

Marsh Posté le 05-06-2010 à 20:54:33    

Bein disons que je le sais surtout par le forum arduino. Maintenant quand j'écris  
 
Chat * c = new Chat(5);
 
ça me marque
 
o: In function `setup':
undefined reference to `operator new(unsigned int)'


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
Reply

Marsh Posté le 05-06-2010 à 21:57:54    

tu veux faire quoi ? Allouer 5 Chats ?
 
montre ta ligne de compilo

Reply

Marsh Posté le 05-06-2010 à 23:12:12    

Le 5 ne sert à rien, juste à être mis dans la propriété _num
 
L'IDE arduino me sort juste ce que j'ai marqué.


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
Reply

Marsh Posté le 06-06-2010 à 08:44:47    

ok donc c'est bien le constructeur de Chat que tu appelles.

 

Peut tu essayer ça à la place de new:

 
Code :
  1. template<class T>
  2. T* my_new( int n )
  3. {
  4.    T* data = reinterpret_cast<T*>(malloc(sizeof(T));
  5.    new (data) T(n);
  6.   return n;
  7. }
  8. Chat* p = my_new<Chat>(5);


Message édité par Joel F le 06-06-2010 à 08:44:54
Reply

Marsh Posté le 06-06-2010 à 08:44:47   

Reply

Marsh Posté le 09-06-2010 à 10:39:57    

bravo le compilo.
si new marche pas, le new placement qui est dans le header <new> ne marchera encore moins IMHO.


---------------
http://projets.6mablog.com/
Reply

Marsh Posté le 09-06-2010 à 13:31:38    

pas forcement. D'experience en embarqué, l'un peut marcher sans l'autre

Reply

Marsh Posté le 09-06-2010 à 14:33:36    

J'ai essayé ça me réponds
 
error: expected constructor, destructor, or type conversion before '*' token In function 'T* my_new(int)':
 At global scope:
Bad error line: -2
 
Bon de toute manière je me suis limité à 2 types d'objets différents. J'initialise les 2 tableaux en global pour les contenir, ça a l'air de passer côté mémoire.


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
Reply

Sujets relatifs:

Leave a Replay

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