150

En ne pas utilisant les conteneurs de la STL tu rate un des plus grand avantages du C++ par rapport au C. Je dis ça, mais au début j'avais fait exactement la même chose que toi grin
Mais de toute façon à la longue tu en aura marre de recoder toujours la même chose, et donc tu finira par utiliser la STL smile

151

Ok. Alors dans toutes les classes prévues par la STL, tu peux me donner le nom de celle qui me convient (vector ? liste ? deque ? associatif ? map? pair ? yen a 50....) ? Je veux juste foutre des pointeurs vers des objets (de même type) et, évidemment, accéder aux objets par ces pointeurs (sisisi !) Merci d'avance hehe

152

std::vector

153

Merci. Si je comprends bien, c'est un objet qui implémente donc un tableau amélioré (conteneur séquentiel, accès par itérateur ou direct). Je suis en train de relire les chapitres qui vont bien. ^^

154

Sasume (./103) :
Dites, comment est-ce que je pourrais compter la somme des nombres de lignes des fichiers qui sont dans une arborescence donnée ?
wc ne traverse pas récursivement l’arborescence, cat non plus sad

Moi je te conseille sloccount
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

155

Folco: ne touche pas les itérateurs, on vit très bien sans, même avec la stl ^^

(oh pinaise il m'a fait peur le mec sur la page de sloccount fear,
sinon...
How to download your copy
You can:
* View the SLOCCount documentation
* View the ChangeLog
* Download version 2.26 (the latest version)
...
ah quand même triso)

156

Donc si j'ai un pointeur vers un conteneur qui contient des objets, je fais ça ?

for (int i=0; i == taille - 1 ; i++)
(*ptr_conteneur)[ i ].méthode();

?

157

Pourquoi pas ptr_conteneur->méthodeDuConteneur() ? Sinon, c’est peut-être ça que tu veux faire : ptr_conteneur->getContenu(i)->méthodeDuContenu().

Ah mais ça y est je viens de voir que ton [i] a été mangé par le fuck parser de bbcode…
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

158

Sasume (./157) :
Sinon, c’est peut-être ça que tu veux faire : ptr_conteneur->getObjet(i)->méthodeDeLObjet().

voilà.
Mais *ptr_conteneur[ i ] n'est pas égal à ptr_conteur->getObjet(i) ?

(par contre, c'est .méthodeObjet() et non ->, si j'ai un tableau d'objet et on de pointeurs d'objets


edit -> han, mon [ i ] s'est fait bouffer bien sûr, il fallait lire :
(*ptr_conteneur)[ i ].méthode();

159

Ok, en fait tu utilises les conteneurs de la STL. Donc oui, il me semble que l’opérateur [] te retourne le contenu à l’indice i.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

160

Ok. Question annexe, je n'ai pas grand intérêt à utiliser un conteneur STL si mon tableau a une taille fixe ? Et un tableau d'objet (pas de pointeurs d'objets), puis-je l'allouer sur la pile, ou mieux vaut-il le faire sur le tas ? Je n'ai aucune idée de ce qu'est capable un PC comparé... à une TI grin J'alloue en général sur la pile par simplicité, mais je ne sais pas si ce choix est bon...

161

Folco (./160) :
Ok. Question annexe, je n'ai pas grand intérêt à utiliser un conteneur STL si mon tableau a une taille fixe ?

Ça dépend aussi des opérations que tu veux faire dessus. Les conteneurs de la STL viennent avec un jeu d’opérations qui peuvent t’être utiles, ou pas.
Tu as aussi les algorithmes polymorphes de la STL (genre sort) qui fonctionnent sur n’importe quel type d’itérateur (y compris donc le bon vieux tableau à indices).
Et un tableau d'objet (pas de pointeurs d'objets), puis-je l'allouer sur la pile, ou mieux vaut-il le faire sur le tas ?
J’ai plutôt l’habitude de tout allouer sur le tas, la pile ne servant qu’aux calculs. Enfin c’est juste mon témoignage, sûrement pas une règle à suivre.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

162

Ok. Il me semble que ça fait faire un déréférencement en plus sur le tas, mais je ne devrais pas penser comme ça, c'est sûrement peanuts grin

163

Bah si, sûrement que bout à bout, des petites mesurettes comme ça ont un impact, mais ce n’est pas forcément la priorité.

Enfin, quoi qu’il soit je ne vois pas pourquoi on aurait un déréférencement de plus sur le tas.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

164

Oui remarque... Toute façon, je ne connais pas la sauce interne, et pour le moment, ce n'est pas une priorité comme tu dis.

Sinon, je n'arrive pas à déclarer un pointeur vers un vecteur contenant des pointeurs sur des objets Module dans ma classe... :
vector<*Module> *m_ModuleList;
Pour moi, je déclare une variable m_ModulesList qui est un pointeur sur un vecteur de pointeurs sur des modules. Mais visiblement ce n'est pas ça... sad

ISO C++ forbids declaration of ‘vector’ with no type
expected ‘;’ before ‘<’ token

165

si tu mets rien d'autre il doit falloir un include et écrire std::vector grin

166

Ah, pas con cheeky (il manquait le std:: )
(sans parler du *Module qui aurait déjà meilleure gueule en Module* cheeky)

edit -> bingo, squalyl a gagné une sucette goût cpp !

167

168

Pourquoi un pointeur ? Pourquoi pas un std::vector, directement comme attribut de classe ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

169

J'en sais rien. Je me suis dit "tiens, je vais allouer sur le tas" grin Mais t'as raison, c'est beaucoup plus simple pour moi de mettre ce tableau sur la pile. Par contre... il fait comment pour redimensionner le vecteur si je lui demande ? Son adresse change ?

170

tu t'en tape de comment il fait. Et tu n'as pas à redimensionner le vecteur explicitement, tu peux te contenter de faire des m_ModuleList.push_back(mon_pointeur);

171

Anéfé, j'ai lu cette méthode dans mon bouquin.

172

Bon, j'ai lu la doc de Qt pour les signaux et slots... Je me doutais bien que ça exigeait de marcher avec des QOBECTS partout, que ça nécessitait de compiler avec qmake etc...
Donc exit.

J'ai implémenté cette classe ultra-basique de messagerie :class Message { public: Message(); bool isMessageForMe(int myID); bool mayIWrite(); int getSenderID(); int getMsgMain(); void *getMsgObjPtr(); int getMsgData(); void sendMessage(int senderID, int dest, int msgMain, void *msgObjPtr, int msgData); private: Message(const Message &); // Only one messenger ! Message operator=(const Message &); int m_SenderID; int m_Dest; int m_MsgMain; void *m_MsgObjPtr; int m_MsgData; };
Les noms de méthode me semblent explicites : puis-je écrire un message (il ne doit pas y en avoir dans ... l'enveloppe ?), est-ce que le message est pour moi ? envoi de tel message, des récupérateurs de messages, et une méthode pour en envoyer un.
Au niveau des données, chaque envoyer met sont ID, l'ID du destinataire, un type de message (fermeture, ouverture de module, quitter etc...), un pointeur vers un éventuel objet (dont le destinataire saura quoi faire), un éventuel entier (pour les messages les plus simples, genre {lancer un module, _module_truc}).
Tous les objets utilisés et potentiellement destinataires/envoyeurs pourront consulter leurs messages et en envoyer aussi (sans téléscopage, il faut un ACK pour en écrire un).

Ca vous parait bien ? Je veux pas faire une file de message, je veux rester très simple. Comme je suppose que vous avez déjà dû avoir à faire un truc similaire, vous trouver ça comment ? qu'est-ce qui pourrait ne pas aller ?

173

Folco (./149) :
J'avais regardé ceux de la STL, mais j'y avais rien compris grin

Utilise ceux de la "QTL" (les conteneurs dans la libQtCore) alors. smile

Ils sont beaucoup plus simples à utiliser. Ici, ce que tu veux est une QList, qui est un tableau de pointeurs. (Il y a aussi QVector qui stocke directement les objets, comme std::vector.)

Tu y perds vraiment à t'obstiner de vouloir coder sans Qt. Le C++ est pourri sans Qt! (Mais les alternatives sont pourries tout court. grin)
Folco (./156) :
Donc si j'ai un pointeur vers un conteneur qui contient des objets, je fais ça ?

for (int i=0; i == taille - 1 ; i++)
(*ptr_conteneur)[ i ].méthode();

?

Avec Qt, tu peux faire:
foreach (const Objet &obj, conteneur)
  obj.methode();

tout simplement. tongue


Et je te signale que si tu utilises un objet conteneur, le vrai contenu sera toujours sur le tas, même quand l'objet conteneur est sur la pile.
squalyl (./165) :
écrire std::vector grin

Ou utiliser using std::vector; ou carrément using namespace std; (pour les gros porcs paresseux grin).
Folco (./172) :
Bon, j'ai lu la doc de Qt pour les signaux et slots... Je me doutais bien que ça exigeait de marcher avec des QOBECTS partout, que ça nécessitait de compiler avec qmake etc...Donc exit.

Pas du tout obligé d'utiliser qmake, tu peux aussi utiliser CMake (que tu as de toute façon intérêt à utiliser pour n'importe quel projet non-trivial!) ou appeler moc-qt4 directement dans tes makefiles ou scripts de compilation. Tant que tu appelles le MOC, tout va bien, peu importe comment tu l'appelles.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

174

Kevin Kofler (./173) :
Avec Qt, tu peux faire:
(pre] foreach (const Objet &obj, conteneur) obj.methode(); [/pre]
tout simplement. tongue.gif

Ca fait pas bosser sur une copie ça ?

Sinon, pour la compilation, Code::Blocks a la bonté de me rendre tout ça transparent et je ne sais pas faire un Makefile, donc je touche à rien, je peux pas tout apprendre à la fois. grin

175

Folco (./174) :
Kevin Kofler (./173) :
Avec Qt, tu peux faire:
(pre] foreach (const Objet &obj, conteneur) obj.methode(); [/pre]
tout simplement. tongue.gif
Ca fait pas bosser sur une copie ça ?

Ça fait marcher en lecture seule, surtout. Tu ne peux pas modifier un conteneur avec foreach, ça itère toujours sur une "copie" (mais comme les conteneurs Qt sont partagés implicitement, la copie n'en est pas vraiment une).
Sinon, pour la compilation, Code::Blocks a la bonté de me rendre tout ça transparent et je ne sais pas faire un Makefile, donc je touche à rien, je peux pas tout apprendre à la fois. grin

Justement, Code::Blocks gère aussi les projets Qt.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

176

Un truc : j'ai besoin, dans mon cas, d'apprendre et de comprendre, donc faut bien que j'essaye de ré-imaginer (en moins bien...) ce qui doit être fait, non ? C'est le but aussi grin

177

Folco (./172) :
void sendMessage(int senderID, int dest, int msgMain, void *msgObjPtr, int msgData);

[…]
Ca vous parait bien ? Je veux pas faire une file de message, je veux rester très simple. Comme je suppose que vous avez déjà dû avoir à faire un truc similaire, vous trouver ça comment ? qu'est-ce qui pourrait ne pas aller ?
Le type de message en void *, c’est une mauvaise idée. Le destinataire ne saura pas vraiment quel est le message, à moins de faire de l’introspection, mais c’est généralement une mauvaise idée.

Qu’est-ce qui ne va pas avec la solution dont je t’ai palré précédemment ? Sinon, Kevin n’a pas complètement tort : le C++ pur est très limité, donc soit tu codes toi-même les couches dont tu as besoin, pour apprendre et comprendre, soit tu utilises celles déjà fournies par Boost ou Qt (je pense que Boost est une bonne première approche, avant Qt) et tu te concentres sur d’autres problèmes de conception, ne t’inquiète pas il y en aura !
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

178

179

Sasume (./177) :
je pense que Boost est une bonne première approche, avant Qt

Moi, je pense que c'est un bordel infame, totalement inadapté pour un débutant. Boost est caractérisé par un abus massif de templates (la fonctionnalité la plus complexe du C++), et non pas pour l'usage évident (conteneurs génériques), mais pour toute sorte de calculs en temps de compilation, pour servir de syntaxe pour n'importe quoi etc. Dans certains cas, c'est juste en interne, mais souvent ces templates se retrouvent dans l'interface publique, ou alors certaines limitations de l'implémentation font qu'on reçoit des messages d'erreur totalement illisibles quand on fait quelque chose qui intuitivement devrait marcher. Il y a même un module Boost qui abuse de la surcharge d'opérateurs pour implémenter quelque chose de type Bison, mais sans étape de génération séparée. sick
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

180

bien entendu on ne peut pas attendre autre chose d'un mec du steering commitee de KDE, environnement qui se base avant tout sur Qt. Ca fait rien, c'est pas grave.