Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1563 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1999235
Ricco
Retour au pays
Posté le 05-06-2010 à 01:01:18  profilanswer
 

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
mood
Publicité
Posté le 05-06-2010 à 01:01:18  profilanswer
 

n°1999257
Joel F
Real men use unique_ptr
Posté le 05-06-2010 à 12:08:12  profilanswer
 

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
n°1999264
Ricco
Retour au pays
Posté le 05-06-2010 à 14:22:46  profilanswer
 

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
n°1999272
Joel F
Real men use unique_ptr
Posté le 05-06-2010 à 17:25:37  profilanswer
 

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.

n°1999291
Ricco
Retour au pays
Posté le 05-06-2010 à 19:36:27  profilanswer
 

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
n°1999294
Joel F
Real men use unique_ptr
Posté le 05-06-2010 à 20:06:17  profilanswer
 

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
n°1999300
Ricco
Retour au pays
Posté le 05-06-2010 à 20:54:33  profilanswer
 

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
n°1999305
Joel F
Real men use unique_ptr
Posté le 05-06-2010 à 21:57:54  profilanswer
 

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

n°1999312
Ricco
Retour au pays
Posté le 05-06-2010 à 23:12:12  profilanswer
 

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
n°1999321
Joel F
Real men use unique_ptr
Posté le 06-06-2010 à 08:44:47  profilanswer
 

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
mood
Publicité
Posté le 06-06-2010 à 08:44:47  profilanswer
 

n°2000129
Lightness1​024
Posté le 09-06-2010 à 10:39:57  profilanswer
 

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/
n°2000202
Joel F
Real men use unique_ptr
Posté le 09-06-2010 à 13:31:38  profilanswer
 

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

n°2000243
Ricco
Retour au pays
Posté le 09-06-2010 à 14:33:36  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Problème pour créer une fonction sous excelprobleme creer une ligne dans une bdd a partir de c++ winform
Développement d'une application pour la gestion de listes de contacts.Comment créer des boutons de formes non régulières sur un useform
Passer d'une séquences à l'autre [flash]hover css sans passer par le background
Fonctions WebMail sous PHPcreer un fichier XML
Comparaison de chaines de caracteres dans 2 listes en VBAQuel langage pour creer ce logiciel ?
Plus de sujets relatifs à : Creer des listes d'ojets et se les passer entres fonctions


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR