390

Folco, par définition, un const est quelque chose de constant, c'est à utiliser sur tout ce qui ne peut pas changer, évidemment pas sur les variables (qui, par définition, varient).
Sasume (./382) :
essemblent à ça : const Cercle & fabriqueUnCercle(const Point & centre, const Longueur & rayon);Du coup, et c’est le bonheur du C++, la plupart des prototypes des fonctions r

C'est une mauvaise idée de retourner un const &, il faut que tu stockes l'objet quelque part où ça reste valide quand la fonction a retourné (une variable locale dans la fonction ne convient pas!), et si la fonction appelante veut stocker la référence pendant plus longtemps, le compilateur ne donnera aucun warning, donc si tu stockes l'objet quelque part dans un static ou dans une variable membre de l'objet, tu risques d'avoir des problèmes si la fonction est appelée une autre fois entretemps.

Bref, les const & sont à réserver pour les arguments. Si tu veux pouvoir retourner ton objet sans tout recopier, il faut rendre ta classe implicitement partagée (comme les classes de données de Qt). (Mais il reste plus efficace de passer des const & comme arguments parce que ça évite de toucher au compteur de références.)
Folco (./388) :
Ah ... Je ne donne aucun chemin... Je partais du principe que le chemin par défaut était celui du TPR, puisqu'un #include "header.h" fonctionne avec le header dans le répertoire du projet. C'est un tort ?

Tu ne peux pas utiliser -I dans l'EDI, du moins pas avec des chemins relatifs (et les -I avec des chemins absolus font que ton projet n'est pas transportable à une autre machine ou même un autre système d'exploitation sur la même machine, donc c'est une mauvaise idée; de plus, ça fait aussi foirer les compilations sans enregistrer, parce qu'un -I référence évidemment la copie enregistrée, pas la copie temporaire).

Le chemin à utiliser est celui de l'arborescence dans l'EDI (dossiers virtuels). Donc un fichier directement dans "Header Files" est à inclure avec #include "foo.h", un fichier dans le dossier toto dans "Header Files" est à inclure avec #include "toto/foo.h" (sauf si ton fichier source est aussi dans le sous-dossier toto). (Ergo, si tu ne veux pas t'embêter avec les chemins pour les #include, n'utilise pas les dossiers virtuels. L'emplacement physique du fichier dans ton dossier du projet n'a aucune importance. L'EDI copie tout dans un dossier temporaire et y réalise physiquement l'arborescence virtuelle définie dans le projet.) Et il faut utiliser des "" et pas des <>.
J'ai oublié de préciser : je fais ça sous Win.

Si c'est Vista, désactive UAC, il paraît que ça empêche parfois GCC de trouver les includes pour je ne sais pas quelle raison.
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é

391

Sasume (./389) :
Bon je te propose de noter le chemin absolu, ce sera plus simple (-IC:\blabla).

Non, c'est une mauvaise idée, cf. ./390. Il ne faut pas utiliser -I dans l'EDI.
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é

392

Ok, devant cette situation, j'ai même pas pensé à ajouter les fichiers à la main au projet via l'IDE sick PpHd, ça marchera comme attendu ?

393

Il n'y a pas de raison pour laquelle ça ne marcherait pas.
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é

394

Kevin Kofler (./390) :
Sasume (./382) :
essemblent à ça : const Cercle & fabriqueUnCercle(const Point & centre, const Longueur & rayon);Du coup, et c’est le bonheur du C++, la plupart des prototypes des fonctions r

C'est une mauvaise idée de retourner un const &
C’est vrai ! J’avais oublié… Ça doit faire plus d’un an que je n’ai pas fait de C++.
fabriqueUnCercle(const Point & c, const Longueur & r);Donc en effet, les prototypes peuvent ressembler à ça :Cercle *
Mélange de pointeurs et de références love
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. »

395

Sasume (./382) :
Là où d’autres langages permettent une écriture plus épurée :
Python :
def fabriqueUnCercle(centre, rayon):
Java :
Cercle fabriqueUnCercle(Point centre, Longueur rayon);

mais dans ces deux exemples tu n'as aucune garantie que la fonction ne va pas modifier ses paramètres, si ? (je trouve que la rigueur imposée par les "const" du C++ est une très bonne chose, même si l'écriture en souffre un peu)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

396

et ça sert a quoi de savoir qu'un objet sera pas modifié?

397

- d'un point de vue utilisateur ça permet de savoir qu'en appelant la méthode X de la lib Y, si le paramètre est de type "const Z", tu peux lui passer ton objet en paramètre sans craindre qu'il soit modifié (donc pas d'effets de bord à son niveau, tu peux sans problème réorganiser tes appels en fonction de cette info, tu n'as pas besoin d'en faire une copie avant l'appel, etc...).

- par opposition, ça permet aussi de savoir qu'une méthode va potentiellement modifier l'objet que tu lui passes en paramètre si il n'y a pas de "const" dans son prototype, et donc qu'il faut faire gaffe quand tu l'appelles à ne pas passer un objet que sur lequel tu ne veux pas que des modifications soient appliquées.

- du coté du compilateur, ça peut éventuellement permettre des optimisations qui ne peuvent être faites qu'en sachant au moment de la compilation que l'objet est en lecture seule.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

398

399

en java il y a "final" qui remplace "const", mais comme les références sont implicites je ne vois pas trop comment comparer avec le C++. Mais ça fait quoi exactement const en C++, tu ne peux plus du tout appeler de méthodes sur l'objet ou alors il y a une distinction entre méthodes non modifiantes et méthodes modifiantes, et tu peux toujours appeler les premières ? parce que si tu ne peux rien faire... cheeky
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

400

une méthode en C++ peut être qualifiée avec "const" (convention qui signifie très logiquement que "this" pointe sur un objet constant), et tu ne peux donc appeler que des méthodes constantes sur un objet constant (de même il y a des itérateurs constants qui itèrent sur une collection d'objets constants, etc).

[edit] au fait, c'est HS ^^ je forkerai si il y a besoin de continuer sur le sujet.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

401

Ximoon (./380) :
À savoir ?


Là:
void f(const int h[3][3]);
void h(int [3][3]);

int g(void)
{
  int t[3][3];
  h(t);
  f(t);
  return 0;
}


Il faut écrire:
f(*(const int (*)[3][3]) &t);

C'est moche sad

402

ça ressemble plus à un bug qu'à un contre-exemple, non ? (et g++ compile ça sans raler)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

403

C++ != C
grin
Et j'ai fait vérifier à des gens s'y connaissant ** beaucoup ** mieux que moi : c'est normal.
Il n'y a pas de cast automatique dans ce cas là sad

404

Il me semble n'avoir pas eu de problème avec Diab pourtant ? trifus Mais je me rappelle peut-être mal cheeky

dehors
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

405

Ximoon (./404) :
Il me semble n'avoir pas eu de problème avec Diab pourtant ? trifus.gif Mais je me rappelle peut-être mal mod.gif


Je te garantis que tu en as avec...

406

Y a-t-il un moyen d'appeler une fonction quand on connait son pointeur ?
J'ai ce gener de truc :
const void* FuncPtr = Func1

Dans un switch, je fais donc varier FuncPtr en fonction de la fonction que je lui assigne. Mais comment faire une sorte de "call FuncPtr()" ?

407

Il faut caster FuncPtr en pointeur de fonction, et ensuite, appliquer les arguments à ce pointeur de fonction trilove
retval = ((return_type ( [c'est ici qu'il faut mettre __attribute__((__stkparm__)) ou __regparm__ si nécessaire] *) (argtype1 arg1, argtype2 arg2, etc.))FuncPtr) (arg1, arg2, etc.)
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

408

Ah euh.... trivial, bien sûr, naturellement j'y étais presque tripo (et dire qu'en assembleur ça prend 3 lettres : J-S-R ! bordel !)

Nan mais sérieux ya pas plus simple ? Je pensais écrire une table de pointeurs de fonction, poru que chaque fonction soit appelée automatiquement suivant un choix de l'utilisateur. Ya pas un truc mieux foutu en C ? C'est quand même pas aussi compliqué de faire un simple jsr, si ?

409

Sinon, tu peux plus simplement définir un type « pointeur sur tel genre de fonction » et ensuite l’utiliser proprement da façon à ne pas avoir besoin de faire ces casts désagréables.
Tu dois donc utiliser des [google]pointeurs sur fonctions[/google] et une définition de type avec [google]typedef[/google].
(Je n’ai pas la syntaxe en tête, c’est pourquoi je te renvoie vers google)

Tiens ça semble pas mal : http://fr.wikibooks.org/wiki/Programmation_C-C++/Pointeurs_et_références_de_fonctions
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. »

410

C'est en effet beaucoup plus agréable grin

Il y a cependant un cas où tu ne peux pas utiliser un type pointeur de fonction (c'est un cas rarement utilisé en C, parce que c'est une source de problèmes de maintenabilité grin), c'est le cas où tu assignes à ton pointeur FuncPtr l'adresse de fonctions qui possèdent une signature "trop différente", par exemple
void foo1(char bar)
void foo2(void * bar)

et que tu veux ensuite appeler, selon un certain critère, l'une ou l'autre des fonctions.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

411

heu c'est assez déconseillé, des appels de fonctions par pointeur sur des signatures différentes, ça relève plutot du pb de conception là... hum

412

Folco (./406) :
Dans un switch, je fais donc varier FuncPtr en fonction de la fonction que je lui assigne. Mais comment faire une sorte de "call FuncPtr()" ?


Il faut que toutes les fonctions appelées est le même prototype. Mettons que ca soit void f(void);
Définissons la variable
 void (*ptrfunc)(void);
 /* Affectons là */
 switch (i)
 {
 case 0: ptrfunc = f1; break;
 case 1: ptrfunc = f2; break;
 case 2: ptrfunc = f3; break;
 case 3: ptrfunc = f4; break;
 case 4: ptrfunc = f5; break;
 default: ptrfunc = f6; break;
}
(*ptrfunc)()


avec fn définit comme void fn(void);

413

Merci ! Ca c'est de la solution simple et facile à mettre en oeuvre love (et ça compile ^^)

414

Il y a plus simple, hein:
void (*ptrfunctbl[6])(void)={f1,f2,f3,f4,f5,f6};
ptrfunctbl[i]()

Je signale aussi que ptrfunctbl[i]() est automatiquement interprété comme (*ptrfunctbl[i])() (c'est une règle spéciale pour les pointeurs de fonction), sauf dans les déclarations de type, évidemment.

Je signale aussi que l'associativité de *ptrfunctbl[6], c'est *(ptrfunctbl[6]): on choisit d'abord l'entrée du tableau, puis on déréférence.
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é

415

Ok Kevin, et ça pond des relogements ta méthode ?

416

Oui.
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é

417

Kevin Kofler (./414) :
Il y a plus simple, hein:

Ouep, mais la spec demandait un switch tongue
Folco (./415) :
Ok Kevin, et ça pond des relogements ta méthode ?

La mienne aussi.
Arrête d'avoir peur des relogements. Quand il en faut, il en faut.

418

Je me serais attendu à ce que l'optimisation du linker sur le code de ./412 enlève les relogements, puisque ce sont essentiellement des lea ?
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

419

PpHd (./417) :
La mienne aussi. Arrête d'avoir peur des relogements. Quand il en faut, il en faut.

Hep, j'ai pas peur m'sieur, mais c'est pour utiliser à fond les fitures d'un certain ohaissecheeky

Franchement, c'est pas une bonne idée pour toi l'exécution en flash ?
Lionel Debroux (./418) :
Je me serais attendu à ce que l'optimisation du linker sur le code de ./412 enlève les relogements, puisque ce sont essentiellement des lea ?

Ya des trucs que je comprendrai jamais dans les compilos/linkers sick

420

Lionel Debroux (./418) :
Je me serais attendu à ce que l'optimisation du linker sur le code de ./412 enlève les relogements, puisque ce sont essentiellement des lea ?

C'est possible, mais je ne m'y firrais pas trop.
Les gcc récent (?) optimisent ce code avec le switch pour faire exactement ce que je le code de Kevin fait !