360

Ah zut grin

Bref, tu vois les idées.
C'est en sciant que Léonard devint scie, n'est-ce pas ?

(il est temps d'aller dormir grin)
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.

361

Bah, tu réinventes la roue, tu devrais utiliser les fonctions de menus.h, qui prennent une ID pour chaque entrée du menu, donc tu peux les faire correspondre.

Enfin bon, si tes enum sont bien fichues, alors, même avec tes fonctions, au maximum tu as un offset à rajouter ou supprimer.
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é

362

363

Ah !!! 500 octets de gagnés, et quelque chose de beaucoup plus propre ! D'ailleurs, ça vous permettra de comprendre beaucoup mieux ce que faisait ce code :
		if (Key == KEY_MODE)
		{
			MenuResult = DrawMenu(&ModeMenu,DScreen);
			switch (MenuResult)
			{
				case 1:
					MenuResult2 = DrawMenu(&ModeMenuLP,DScreen);
					break;
				case 2:
					MenuResult2 = DrawMenu(&ModeMenuDP,DScreen);
			}
			if ((MenuResult != 0) && (MenuResult2 != 0))
			{
				MainData.ToolsMode[MenuResult-1][MainData.Tool] = MenuResult2 - 1;
			}
			
		}

Pour info, DrawMenu() retourne 0 si le menu a été quitté avec Echap, sinon le numéro de l'item sélectionné.
Surtout, j'aimerais que vous me disiez comment écrire ça plus proprement, je vois bien à chacun de vos exemples que j'ai encore beaucoup à apprendre de ce côté-là. grin

Seil hic, j'ai un warning à l'initialisation, il manque des braces ... tsss
Le proto :
typedef struct Data_s
{
	WIN_RECT	Curs;
	short	ToolsMode[PLANE_COUNT][TOOLS_COUNT];
	short	Tool;
	short	Cursor;
	short	Flags;
	short	CircleRadius;
	short	EllipseAxe1;
	short	EllipseAxe2;
	SCR_RECT	Clip;
} Data_t;

Et l'initialisation :
	Data_t MainData =												//default values
	{
		{LCD_WIDTH/2,LCD_HEIGHT/2,LCD_WIDTH/2,LCD_HEIGHT/2},
		{A_XOR,A_XOR,A_NORMAL,A_NORMAL,A_NORMAL,A_NORMAL,
		A_NORMAL,A_NORMAL,A_NORMAL,A_NORMAL,A_NORMAL,A_NORMAL},
		TOOL_DOT,CURSOR_0,FLAGS_DEFAULT,CIRCLE_RADIUS,ELLIPSE_AXE_1,ELLIPSE_AXE_2,{{0,0,239,127}}
	};

Un bête problème de syntaxe ?

364

Le compilo râle que tu es en train de déclarer un tableau 2D comme tableau 1D.
Avec 12 valeurs, les couples {PLANE_COUNT, TOOLS_COUNT} pourraient être {1, 12}, {2, 6}, {3, 4}, {4, 3}, {6, 2}, {12, 1}, mais j'imagine que PLANE_COUNT == 2, donc ça doit être
{{A_XOR,A_XOR,A_NORMAL,A_NORMAL,A_NORMAL,A_NORMAL}, 
{A_NORMAL,A_NORMAL,A_NORMAL,A_NORMAL,A_NORMAL,A_NORMAL}}

ou
{{A_XOR,A_XOR},{A_NORMAL,A_NORMAL},{A_NORMAL,A_NORMAL}, 
{A_NORMAL,A_NORMAL},{A_NORMAL,A_NORMAL},{A_NORMAL,A_NORMAL}}


avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

365

Ben j'avais essayé ta seconde solution, même résultat confus à moins que j'ai fait une erreur en croyant faire ça ...

Oui , PLANE_COUNT == 2 effectivement. Ca veut dire que mon tabealu doit prendre la première forme ? On écrit des lignes ou des colonnes entre les accolades ?

366

Ce n'est pas la peine de faire un switch pour seulement 2 cas, un simple if est plus adapté dans ce cas (plus court, plus lisible et non redondant parce que tu n'as qu'un seul test à faire, le 2ème cas est le else), le code sera aussi plus rapide et compact.

Il faut au minimum 3 cas pour que le switch ait un intérêt.

Enfin, dans ce cas il y a en fait 3 cas, mais le 3ème est caché (sick). Cela dit, j'écrirais ton code comme ça:
if (Key == KEY_MODE) { 
  MenuResult = DrawMenu(&ModeMenu,DScreen); 
  if (MenuResult) {
    MenuResult2 = DrawMenu(--MenuResult ? &ModeMenuDP : &ModeMenuLP,DScreen);
    if (MenuResult2)
      MainData.ToolsMode[MenuResult][MainData.Tool] = MenuResult2 - 1;
  }
}
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é

367

Folco (./365) :
Oui , PLANE_COUNT == 2 effectivement. Ca veut dire que mon tabealu doit prendre la première forme ?

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é

368

Kevin Kofler (./366) :
Il faut au minimum 3 cas pour que le switch ait un intérêt.

Ben en fait, ya le cas (MenuResult == 0) qui est pas traité. je l'avais écrit avec juste un break dans un premier temps, l'optimiseur le dégage.
En tout cas, merci pour ton code, il me donne des idées d'optimisations auxquelles je n'ai jamais encore pensées, et pour cause ^^

Merci pour la seconde réponse.

369

Au fait, comment fait-on pour faire un programme kernel ? Il n'y a qu'un header à rajouter ? J'essairais bien le dernier truc de Lionel, encore faut-il que je sache comment compiler. smile

370

Je voudrais également porter ce header en C :
pedrom-asm.h
.set	pedrom__stdin,		pedrom__0000
.set	pedrom__stdout,		pedrom__0000+4
.set	pedrom__stderr,		pedrom__0000+8

.set	pedrom__printf,		pedrom__0004
.set	pedrom__vcbprintf,	pedrom__0005
.set	pedrom__clrscr,		pedrom__0006
.set	pedrom__fclose,		pedrom__0007
.set	pedrom__freopen,	pedrom__0008
.set	pedrom__fopen,		pedrom__0009
.set	pedrom__fseek,		pedrom__000a
.set	pedrom__ftell,		pedrom__000b
.set	pedrom__feof,		pedrom__000c
.set	pedrom__fputc,		pedrom__000d
.set	pedrom__fputs,		pedrom__000e
.set	pedrom__fwrite,		pedrom__000f
.set	pedrom__fgetc,		pedrom__0010
.set	pedrom__fread,		pedrom__0011
.set	pedrom__fgets,		pedrom__0012
.set	pedrom__ungetc,		pedrom__0013
.set	pedrom__fflush,		pedrom__0014
.set	pedrom__clearerr,	pedrom__0015
.set	pedrom__ferror,		pedrom__0016
.set	pedrom__rewind,		pedrom__0017
.set	pedrom__fprtinf,	pedrom__0018
.set	pedrom__tmpnam,		pedrom__0019

.set	pedrom__qsort,		pedrom__001b

.set	pedrom__bsearch,	pedrom__001e
.set	pedrom__remove,		pedrom__001f
.set	pedrom__unlink,		pedrom__001f
.set	pedrom__rename,		pedrom__0020
.set	pedrom__atoi,		pedrom__0021
.set	pedrom__atol,		pedrom__0021

.set	pedrom__rand,		pedrom__0023
.set	pedrom__srand,		pedrom__0024
.set	pedrom__calloc,		pedrom__0025
.set	pedrom__realloc,	pedrom__0026
.set	pedrom__atof,		pedrom__0027
.set	pedrom__sttputchar,	pedrom__0028	| ???
.set	pedrom__perror,		pedrom__0029
.set	pedrom__getenv,		pedrom__002a
.set	pedrom__system,		pedrom__002b
.set	pedrom__setvbuf,	pedrom__002c
.set	pedrom__exit,		pedrom__002d
.set	pedrom__atexit,		pedrom__002e

Le truc, c'est que j'ai pas la moindre idée de comment écrire la première ligne pour que ça crée les exports corrects pour le kernel. grin

J'imagine des trucs genre :
void pedrom__getenv(char * "asm (%a2)";
Mais je suis complètement dans le flou ^^

371

Folco (./369) :
Au fait, comment fait-on pour faire un programme kernel ?

sick

Project / Options /Compilation / Program Options... / Operating System: Recent Doors-compatible kernels

En ligne de commande (sick), -DUSE_KERNEL.
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é

372

Folco (./370) :
Le truc, c'est que j'ai pas la moindre idée de comment écrire la première ligne pour que ça crée les exports corrects pour le kernel.

#define pedrom__getenv pedrom__002a
void pedrom__getenv(char * "asm (%a2)";

const char *pedrom__getenv(const char * asm("a2"));

Et pouf la portabilité... sad
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é

373

Kevin Kofler (./372) :
const char *pedrom__getenv(const char * asm("a2"));

Ah oui pas con, getenv renvoie bien quelque chose en effet triso
Mais au fait, pourquoi un const pour l'argument ? Qu'est-ce qui te fait mettre ça ?
Kevin Kofler (./372) :
Et pouf la portabilité...

Sauf si c'est pour un soft pedrom-only. Puis tu sais bien que je sais faire des appels à PedroM qui fonctionnent parfaitement sous AMS cheeky

374

Folco (./373) :
Mais au fait, pourquoi un const pour l'argument ? Qu'est-ce qui te fait mettre ça ?

getenv ne change pas la chaîne de caractères que tu lui passes, donc c'est un pointeur sur const char.

Prends l'habitude du const partout où c'est possible, ça t'empêchera de te taper des warnings et ce sera aussi très important si tu veux te mettre au C++ un jour.
Kevin Kofler (./372) :
Et pouf la portabilité...
Sauf si c'est pour un soft pedrom-only.

C'est bien ce que je veux dire, hein...
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é

375

Prends l'habitude du const partout où c'est possible, ça t'empêchera de te taper des warnings et ce sera aussi très important si tu veux te mettre au C++ un jour.

oui pencil
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

376

Au sujet de la portabilité, je parlais de pcontrol, qui n'a visiblement pas sa place sous AMS. Je veux le refaire en C, c'est la fôôte à PpHd avec la nouvelle alpha de PedroM tsss


Pour ce qui est des const, est-ce que c'est typiquement à employer dans les paramètres passés à une fonction ? Ou aux tableaux de chaines de caractères ?
Parceque si j'assigne ça à une variale, je ne pourrai plus la modifiée...
Donc c'est le genre de truc à utiliser absolument quand je fais une PortSetPlane(Plane), avec comme proto "void PortSetPlane(const void*);" ?

digression -> pourquoi spécialement en C++ ?

377

parce qu'en c++ si tu mets pas les consts au bon endroit ça merdouille grave angry alors qu'en C on peut tricher avec des casts

378

Oui mais si t'as besoin de tricher c'est que tu t'es raté dans ton design grin
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.

379

Ximoon (./378) :
Oui mais si t'as besoin de tricher c'est que tu t'es raté dans ton design biggrin.gif


Faux. Il y a 1 cas du C où tu es obligé de tricher avec les const car il ne fait pas la conversion automatique.
(Mais un cas, j'ai bien dit un cas, pas deux).
Folco (./376) :
Au sujet de la portabilité, je parlais de pcontrol, qui n'a visiblement pas sa place sous AMS. Je veux le refaire en C, c'est la fôôte à PpHd avec la nouvelle alpha de PedroM tsss.gif


Mais pourquoi, qu'ai-je fait ?
Folco (./370) :
Je voudrais également porter ce header en C :

Regarde le répertoire 'example' de PedroM.
Attention : il n'est pas conseillé de copier les headers fournis dans ton header tigcc : tu vas tout casser sinon.
Utilise bien la directive -Iinclude !

380

PpHd (./379) :
Ximoon (./378) :
Oui mais si t'as besoin de tricher c'est que tu t'es raté dans ton design biggrin.gif


Faux. Il y a 1 cas du C où tu es obligé de tricher avec les const car il ne fait pas la conversion automatique.
(Mais un cas, j'ai bien dit un cas, pas deux).


À savoir ?
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.

381

PpHd (./379) :
Mais pourquoi, qu'ai-je fait ?

Juste apporté la motivation et tester mes nouvelles Connaissances grin
PpHd (./379) :
Regarde le répertoire 'example' de PedroM.
Attention : il n'est pas conseillé de copier les headers fournis dans ton header tigcc : tu vas tout casser sinon.
Utilise bien la directive -Iinclude !

Ok, je vais regarde. smile

382

Folco (./376) :
Pour ce qui est des const, est-ce que c'est typiquement à employer dans les paramètres passés à une fonction ?
Oui, ça permet de réaliser des appels du genre « maFonction("ma chaîne"); », car les constantes littérales sont … constantes.
Ou aux tableaux de chaines de caractères ?
C’est-à-dire ?
Parceque si j'assigne ça à une variale, je ne pourrai plus la modifiée...
Effectivement, ce n’est pas à utiliser sur tes variables. C’est un mécanisme qui permet de protéger tes données. Utilise-le quand c’est nécessaire.
digression -> pourquoi spécialement en C++ ?
En C++ tu manipuleras souvent des objets (un peu comme des structures en C), et quand tu passeras un objet en argument à une fonction celle-ci aura accès à tout un tas de fonctions qu’elle pourra appliquer sur l’objet, elle pourrait donc faire des bêtises et casser ton objet. Pour éviter ça, tu peux utiliser une copie de ton objet (comme ça, même si la fonction la modifie, tu t’en fous). Mais c’est un peu lourd de recopier des grosses structures de données à chaque appel de fonction, donc une autre solution c’est que la fonction qui utilise un objet en argument garantisse qu’elle ne modifiera pas l’objet (comme ça, pas de risque de faire des bêtises, et puis ça permet plus simplement de contrôler l’accès aux objets), en prenant en paramètre un objet constant.

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

Là où d’autres langages permettent une écriture plus épurée :
Python :
def fabriqueUnCercle(centre, rayon):
Java :
Cercle fabriqueUnCercle(Point centre, Longueur rayon);
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. »

383

Merci pour tout.
Sasume (./382) :
C'est-à-dire ?

Je pensais aux simples chaines de caractères, bêtes et méchantes.

PpHd -> ça a l'air génial tout ça love

384

PpHd (./379) :
Regarde le répertoire 'example' de PedroM.
Attention : il n'est pas conseillé de copier les headers fournis dans ton header tigcc : tu vas tout casser sinon.
Utilise bien la directive -Iinclude !

Le mieux ne serait-il pas de copier le répertoire include de PedroM dans mon projet, puis de faire un -Iinclude ?
J'utilise l'IDE, parce que je ne suis pas encore à l'aise avec la compilation du C et toutes ses options. D'abord j'apprends le langage, les subitilités de ce genre viendront après.
Et merci pour le conseil en gras, on sait jamais j'aurais pu essayer ^^

385

Oui, comme ça si tu fais une archive de ton projet, tout le monde pourra le compiler de chez lui, en la téléchargeant.
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. »

386

Bon tout ça c'est mignon, mais j'arrive pas à include le moindre header, ça commence bien... neutral

J'ai donc le répertoire include dans ../<mon projet>. J'ai également rajouté -Iinclude dans les options de GCC, via Project/Options/Compilation
J'ai essayé les inclusions avec des guillemets et des chevrons, avec des slashs ou des anti-slashs, rien n'y fait, j'arrive pas à lui montrer mes headers ... sad

Ca me ferait chier de mettre ces headers directement dans le répertoire du source, ça ferait crade ...

387

Tu précises quel chemin dans ta directive -I ? Si tu donnes un chemin relatif, il faudrait qu’on sache quel est le répertoire de travail au moment de l’invocation de tigcc…
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. »

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 ?

J'ai oublié de préciser : je fais ça sous Win. Je sais pas si une notation ../include, donc gcc -xxxx -I../include, ça doit marcher.
Ou alors, #include "../include/pedrom.h". Mais ça ne marche pas non plus.

389

Le #include "header.h" fonctionne avec une bidouille de tigcc je crois.
Bon je te propose de noter le chemin absolu, ce sera plus simple (-IC:\blabla).
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. »

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é