240

Ben quand on commence par dire qu'on va assembler un programme mieux qu'un humain, ça fait très con d'écrire un adressage qui n'existe pas je trouve...

241

Folco (./238) :
même en C, langage de haut niveau
trisotfl
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#

242

Ben... on lit de tout, moyen niveau et haut niveau à propos de ce langage... Au point où on ne contrôle plus rien sur la machine en C (ou du moins, où l'on a rien besoin d'en connaitre), je vois pas où est le problème à appeler ça un langage de haut niveau. Surtout pour un langage qui se veut portable.

243

un langage où tu fais l'allocation mémoire à la main, c'est un langage de bas niveau tongue (ou de moyen niveau mettons, mais le C a d'autres features qui en font un langage de bas niveau. Enfin ça dépend ce qu'on fait en C, disons qu'il est utilisable à moyen niveau si on veut, c'est un peu un mélange. Mais haut niveau, laisse-moi rire...)
et ça me paraît assez irréaliste de coder en C correctement sans rien connaître du fonctionnement de la machine derrière (bon tu peux en connaître plus ou moins, et ça dépend ce que tu codes, pour hello world ok ça va, mais bon ^^)

Un exemple : tu es à peu près obligé de connaître la représentation interne des chaînes de caractères pour les manipuler sans faire un programme qui plante aléatoirement (si tu sais pas ce que tu fais tu te retrouves avec des buffer overflow à coup sûr). Et d'ailleurs tu es très souvent amené à utiliser cette représentation interne directement... bref la manipulation des strings en C, par exemple, est absolument de bas niveau.
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#

244

ben quand tu fais un malloc parce que t'as un lib derrière, je vois pas la différence profonde avec le fait d'écrire 10->a en basic. ton malloc réservera une zone de mémoire sans rien mettre dedans, en basic yaura 10, c'est la seule différence majeure. d'ailleurs, tu feras ton malloc sans savoir comment est foutue la ram, comment l'os s'en occupe, si les adresses utilisées sont virtuelles ou non, comment est foutu le FS etc... je vois pas où est le côté bas niveau. t'es pas obligé de connaitre la moindre structure de quoi que ce soit au niveau machine/os pour faire marcher ton programme. comme en basic, quoi. t'ouvres de fichiers, les modifie et les crée sans rien en savoir. appeler ça du bas niveau.... l'assembleur doit être du niveau négatif alors, sous-terre, underground ou que sais-je encore tiens grin

245

c'est pas parce que c'est bas qu'il n'y a pas encore plus bas ^^. L'assembleur est du *très* bas niveau wink
(je sais pas si tu as lu mon post complet, j'ai édité ^^. Le C a à la fois des features bas niveau et des features moyen niveau (haut niveau pas vraiment, enfin tu peux utiliser des libs pour rajouter des couches d'abstraction, mais c'est pas le langage lui-même))
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#

246

alors c'est qu'un souci de référentiel. si tu pars du principe que l'asm, c'est du ultra-bas under level, alors ok le C peut être du bas niveau. Mais je préfère dire que l'asm est de bas niveau, c'est plus simple. difficile de dire que le C est au même niveau grin
t'as pas la notion de registre (aller, on te fait bander très très fort avec un register, mais tu sais même pas ce qu'il en advient au final), t'as pas la notion de pile (réellement, pile LIFO utilisée conjointement par l'OS, les programmes et le proc, comme on voit en 68k), la mémoire tu sais pas ce que c'est (si ce n'est "un truc de telle taille que j'ai demandé et qu'on m'a donné"), les ports matériels faut vraiment que tu le veuilles pour en entendre parler, les flags c'est pour les chiens, le prefetch et autres joyeusetés du smc on meurt sans savoir ce que c'est, etc... j'ai fait qu'un tour miniature... Si le C demande 10 fois moins de réflexion que l'asm (le code proprement dit s'écrit aussi vite que du basic, pour le moment je me perds principalement au niveau des déclarations, c'est une question de pure technique et pas d'implémentation liée à la machine cible), c'est bien qu'on est pas au même niveau... ya une marche d'écart entre C et asm quand même... je dirais qu'on a fait 80% du chemin qui sépare l'asm du basic ^^ sérieux, un code C ressemble le plus auquel des deux ? cheeky

247

(juste pour dire que ton erreur avec mpcrel n'est pas dû à un langage pourri mais à un outil moisi 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.

248

ah, entre bug et concept foireux mon coeur balance, je sais pas si c'est l'implémentation qui est foireuse, ou mon utilisation de ce switch en opposition avec d'autres qui me donne tort dans cette histoire ^^

edit -> Sally, désolé, je trouve toujours tes avis et conseils très sensés, mais là ça a vraiment du mal à passer ^^

249

(./239)
Poste-nous la façon dont DrawingData est déclaré, ainsi que les options du compilo, du linker, de l'assembleur et les options (Project -> Options si tu utilises un TIGCC Project) ayant trait aux BSS smile
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

250

Je ne dis évidemment pas que le C est un langage de même niveau que l'assembleur.
Évidemment si par langage de haut niveau tu entends « langage autre que l'assembleur », le C en est un, mais c'est pas très utile comme distinction¹ cheeky. Évidemment il y a une grosse marche entre l'assembleur (0 abstraction) et tous les autres langages (qui ont un niveau variable d'abstraction). Mais le C est un langage de bas niveau (ça a même tendance à être *le* langage de bas niveau souvent, même s'il en existe d'autres) parmi les langages qui ne sont pas l'assembleur.

¹Autrement dit : si « langage de bas niveau » == « assembleur », autant dire systématiquement « assembleur », c'est plus court et plus clair 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#

251

Folco (./246) :
difficile de dire que le C est au même niveau biggrin.gif

si, c'est quasiment au même niveau, sauf en effet quelques trucs pratiques: le C gère pour toi les registres et génère de manière pratique du code pour des expressions.

a part ça y'a rien qui en "élève le niveau". les strings sont les mêmes qu'en ASM, c'est un bon exemple.

faut tout gérer à la main. malloc est géré en collaboration avec le système (surtout sur ti) mais la libération des blocs, par exemple, ne se fait pas toute seule.

cross: pour moi le C est de l'asm mieux écrit.

252

Sally -> okok, je vois bien la distinction que tu fais quand même. grin Arrêtons-là si tu veux grin

Lionel -> ok :
vars.h :
struct Misc
{
	WIN_RECT	Curs;
	short	CursModePlane0;
	short	CursModePlane1;
	...
};
extern struct Misc DrawingData;

J'arrive pas à déclarer le type de la structure et le fait qu'elle soit "extern" simultanément... c'est pas ma faute à moi comme dirait l'autre, j'ai essayé bien des choses mais sûrement pas la bonne ...

ensuite, dans main(), j'ai l'initialisation de la structure :
	struct Misc DrawingData =									//default value.
	{
		{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}}
	};

Et enfin, je l'utilise dans tools.c, après avoir inclus vars.h :
void DispRectangle(void* Planes)
{
	short TmpX0 = DrawingData.Curs.x0;
	short TmpY0 = DrawingData.Curs.y0;
	if (TmpX0 > DrawingData.Curs.x1)
	{
		DrawingData.Curs.x0 = DrawingData.Curs.x1;
		DrawingData.Curs.x1 = TmpX0;
	}
	if (TmpY0 > DrawingData.Curs.y1)
	{
		DrawingData.Curs.y0 = DrawingData.Curs.y1;
		DrawingData.Curs.y1 = TmpY0;
	}
	PortSetPlane(Planes);
	DrawClipRect(&DrawingData.Curs,&DrawingData.Clip,DrawingData.RectangleModePlane0);
	PortSetPlane(Planes+LCD_SIZE);
	DrawClipRect(&DrawingData.Curs,&DrawingData.Clip,DrawingData.RectangleModePlane1);
}

et pareil, je veux faire de PlanesPtr une variable globale au programme, sans la passer en variable globale (déclarée avant la définition de main), pour ne pas l'avoir en bss.

Dans le projet, j'ai spécifié que les BSS soivent être mergées avec les sections de données. En l'état actuel, ça compile sans warnings (si je ne spécifie pas -mpcrel). J'ai les options par défaut pour tous les programmes (compilateur et assembleur) de GCC4TI.

253

squalyl (./251) :
cross: pour moi le C est de l'asm mieux écrit.

Mais je veux précisément arriver à ça en effet ! C'est pour ça que je me penche sur le résultat au niveau ASM, même si je pourrais dire "ça marche donc c'est bon" !

254

Tu te méprends : le "extern" n'est pas une information de type, et est don relatif à ta variable et non à ton type smile
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.

255

Ah ! Je me doute que j'ai encore pas mal d'incompréhension entre ce que je dis dans la pratique au compilateur et ce que je veux lui faire faire !

256

Donc : retour sur l'extern happy

En fait, le compilateur ne connait, dans un fichier, que ce qu'il a vu avant le code courant. Si tu as mis un "include", ça va faire un copier/coller, comme en assembleur, et ainsi rajouter des connaissances a priori au fichier courant.
C'est pour ça que pour les fonctions tu dois déclarer un prototype, pour dire au compilateur à quoi ressemble la fonction, et c'est pour ça que ce prototype doit être mis avant l'appel. En pratique, on met les prototype dans un header et on l'inclut au début du fichier où l'on veut appeler cette fonction.
Pour les variables, c'est exactement la même chose, sauf que le "extern" doit être ajouté explicitement, alors que pour une fonction, un prototype est implicitement déclaré comme étant "extern" (tu peux le rajouter si tu veux, certains le font par souci de clarté).

On a donc :

- dans un header (par exemple glob_Types.h):

typedef struct Ma_Structure_s
{
...
}
Type_De_Ma_Structure_t;

- dans un fichier .c (par exemple glob_Datas.c)

#include "glob_Types.h"
...
Type_De_Ma_Structure_t Ma_Variable_Globale;

- dans un header (par exemple glob_Datas.h)

#include "glob_Types.h"
...
extern Type_De_Ma_Structure_t Ma_Variable_Globale;

- dans un autre fichier .c, où est ton code qui utilise la variable :

#include "glob_Datas.h"
...
Ma_Variable_Globale.Truc = Machin;

Donc dans l'ordre :
- déclaration du type
- création effective de la variable
- création du prototype de la variable
- utilisation de la variable

Note que rien ne t'empêche de mettre tout dans un même header, ou de tout déclarer directement dans le fichier .c où tu utilises tout ça, là, c'est une question de rêgles de codage, et j'utilise les miennes dans mes exemples cheeky
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.

257

Folco (./252) :
:struct Misc DrawingData = //default value. { ... };ensuite, dans main(), j'ai l'initialisation de la structure
Attention ! (tu as testé ton programme ? je suppose que non)
Ce que tu fais là n'est pas une affectation simple, c'est une déclaration de variable (parce qu'il y a un type). Une déclaration de variable dans une fonction, ça crée une variable locale ! donc si tu as effectivement écrit ça dans main, ça crée une variable locale qui s'appelle DrawingData, et ça ne touche pas à la variable globale qui a le même nom (et ensuite tant que tu restes dans le scope de cette déclaration, c'est-à-dire dans le corps de main(), DrawingData désignera ta variable locale, et la globale sera donc inaccessible).

Si ce que tu veux faire est juste initialiser ta variable globale, il ne faut pas la redéclarer. Il faut simplement lui affecter sa valeur initiale. Concrètement, il faut enlever le "struct Misc", ainsi DrawingData sera reconnu comme une référence à quelque chose qui a été déclaré avant, et non comme une nouvelle variable.


Sinon petite précision sur ce que dit Ximoon : la différence qu'il fait entre les .c et les .h est la suivante : le code qui n'a aucun effet (il donne des informations au compilateur, mais ne se traduit par rien après compilation. Il peut donc sans problème être inclus dans plusieurs fichiers .c différents, sans risque de duplication de code dans le résultat de la compilation.) est dans des .h. C'est le cas des déclarations extern, qui disent en gros « une variable de tel nom et de tel type existe » (après quand il s'agira de la trouver le linker se débrouillera — ou pas, auquel cas tu auras une erreur)

Le code qui fait quelque chose (aura une traduction assembleur) est dans des .c, qui ne sont pas censés être inclus dans autre chose. Ici, il s'agit de la déclaration non-extern (qui crée effectivement la variable globale, et doit donc être unique), et aussi du code qui utilise la variable.
Folco (./252) :
et pareil, je veux faire de PlanesPtr une variable globale au programme, sans la passer en variable globale
confus
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#

258

"sans qu'elle soit foutue en bss" ^^

Sinon ok, j'avais oublié cette histoire de portée de variable couic

Merci pour le reste, je teste ça prochainement !

259

Folco (./236) :
Kevin Kofler (./234) :
Écritures dans ta structure globale.
Tu veux dire quoi précisément ? Il est infoutu d'utiliser offset(an) pour ça ?? Pourquoi c'est pas fait par défaut, toi qui est toujours pour l'optimisation taille ?

1. Ça consomme un registre d'adresses.
2. Si la destination est trop loin pour un addressage PC-relatif (par exemple: BSS, fichier de données externe, programme de plus de 32 KO), lea x.l,%a0; move.l ...,(%a0) est plus long que move.l ...,x.l. (Depuis que les BSS sont gérés même sans kernel, c'est un cas assez courant.) Et sans -mpcrel, le compilateur ne peut pas présupposer un adressage relatif.
3. L'optimisation linker ne peut pas résoudre le problème nº2 à cause du problème nº1 (on ne peut pas optimiser un move.l ...,x.l en un lea x(%pc),%a0; move.l ...,(%a0) parce qu'on ne sait pas si %a0 (ou n'importe quel autre registre d'adresses) est libre à cet endroit).
Folco (./238) :
Je compile avec -mpcrel :"Symbol 'DrawingData' too far for size 2 reloc at 0x694".

Ce n'est pas sans raison que -mpcrel n'est pas par défaut. Tu dois avoir un BSS qui te reste.
Sally (./243) :
un langage où tu fais l'allocation mémoire à la main, c'est un langage de bas niveau tongue

Bas niveau = langage machine et assembleur.
Moyen niveau = C, à la limite le C++ selon l'utilisation qu'on en fait (et quelques langages exotiques du même type, mais il n'y a que le C/C++ à être couramment utilisé).
Haut niveau = tout le reste.
Folco (./244) :
ben quand tu fais un malloc parce que t'as un lib derrière, je vois pas la différence profonde avec le fait d'écrire 10->a en basic. ton malloc réservera une zone de mémoire sans rien mettre dedans, en basic yaura 10, c'est la seule différence majeure. d'ailleurs, tu feras ton malloc sans savoir comment est foutue la ram, comment l'os s'en occupe, si les adresses utilisées sont virtuelles ou non, comment est foutu le FS etc... je vois pas où est le côté bas niveau. t'es pas obligé de connaitre la moindre structure de quoi que ce soit au niveau machine/os pour faire marcher ton programme. comme en basic, quoi. t'ouvres de fichiers, les modifie et les crée sans rien en savoir. appeler ça du bas niveau.... l'assembleur doit être du niveau négatif alors, sous-terre, underground ou que sais-je encore tiens grin

Tu peux aussi appeler les ROM_CALLs et les autres fonctions de TIGCCLIB en assembleur. smile
Folco (./246) :
t'as pas la notion de registre (aller, on te fait bander très très fort avec un register, mais tu sais même pas ce qu'il en advient au final)

Rien. grin Tout ce que ça fait de déclarer une variable register avec un GCC récent, c'est que tu n'as pas le droit de prendre l'adresse. À part ça, GCC s'en fout éperdument, il alloue les registres automatiquement.

La seule manière de forcer une variable dans un registre est de spécifier exactement lequel (cf. local register variables et global register variables).
t'as pas la notion de pile

Effectivement, tu ne peux pas faire n'importe quoi avec la pile CPU, ça t'évite de te retrouver avec un return qui plante parce que tu n'as pas restauré la pile correctement. tongue
Ximoon (./247) :
(juste pour dire que ton erreur avec mpcrel n'est pas dû à un langage pourri mais à un outil moisi grin)

Non, c'est dû à une combination non valide des flags de compilation (un PEBKAC, quoi).
Sally (./250) :
¹Autrement dit : si « langage de bas niveau » == « assembleur », autant dire systématiquement « assembleur », c'est plus court et plus clair cheeky

Si tu programmes en éditant le code machine à l'éditeur hexa, tu ne fais pas de l'assembleur, mais tu programmes aussi à bas niveau. tongue
Folco (./252) :
J'arrive pas à déclarer le type de la structure et le fait qu'elle soit "extern" simultanément...

C'est normal, il faut déclarer ça séparément.
Dans le projet, j'ai spécifié que les BSS soivent être mergées avec les sections de données.

Désactive carrément le BSS au niveau du compilateur (-mno-bss).
J'ai les options par défaut pour tous les programmes (compilateur et assembleur) de GCC4TI.

sick Pourquoi pas utiliser le vrai TIGCC?
Sally (./257) :
Si ce que tu veux faire est juste initialiser ta variable globale, il ne faut pas la redéclarer. Il faut simplement lui affecter sa valeur initiale. Concrètement, il faut enlever le "struct Misc", ainsi DrawingData sera reconnu comme une référence à quelque chose qui a été déclaré avant, et non comme une nouvelle variable.

Attention, il faut écrire:
DrawingData = (struct Misc)      //default value. 
{ 
        ... 
};

si tu veux affecter une structure comme ça, si tu mets juste le '{', le compilateur parse ça comme un tableau et ça ne va pas marcher. (Et cette syntaxe est du C99 et du GNU C, en C90, tu ne peux pas écrire ça du tout.)
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é

260

Kevin Kofler (./259) :
sick Pourquoi pas utiliser le vrai TIGCC?

Parce qu'il préfère utiliser le vrai GCC4TI ? cheeky
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

261

Folco (./236) :
"Je veux arriver à un programme qui ressemble à ça", != "Je veux faire un programme qui marche je sais pas trop comment"

Pense ce que tu veux, mais *pour moi* tu as plutot l'approche qui est a droite que celle de gauche
Folco (./246) :
sérieux, un code C ressemble le plus auquel des deux ? mod.gif

Tout dépend de comment tu code en C, autant il peut fortement ressembler a de l'ASM, autant il peut ressembler a du haut niveau, c'est variable


./260: triso
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.

262

Kevin Kofler (./260) :
sick.gif Pourquoi pas utiliser le vrai TIGCC?


on va pas commencer a troller la dessus hein!

263

Kevin Kofler (./259) :
Attention, il faut écrire:
DrawingData = (struct Misc) //default value. { ... };si tu veux affecter une structure comme ça, si tu mets juste le '{', le compilateur parse ça comme un tableau et ça ne va pas marcher. (Et cette syntaxe est du C99 et du GNU C, en C90, tu ne peux pas écrire ça du tout.)

Yep !
Mais bien sûr, j'avais pas essayé ça, c'est en fait un simple cast ?.

264

RAHAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHAHAHAHAH
Je crois que peut-être j'y suis éventuellement arrivé...

En fait, je crois que mon erreur était de ne pas déclarer ma variable globalement, ie en-dehors d'une fonction, fût-elle main.
Alors, récapilutitatons :
Dans vars.h, j'ai ça :
typedef struct Data
{
	WIN_RECT	Curs;
	short	CursModePlane0;
	...
} Datat;

extern Datat DrawingData;


Dans mon fichier principal, j'ai ça :
#include "vars.h"

Datat DrawingData;

void _main(void)
{
	...
	Datat DrawingData =											//default value.
	{
		{LCD_WIDTH/2,LCD_HEIGHT/2,LCD_WIDTH/2,LCD_HEIGHT/2},
	...
	}
	...
}

Et dans les fichiers où j'utilise DrawingData, je fais un #include "vars.h"
C'est à peu près bon ? fear

265

Folco (./263) :
Mais bien sûr, j'avais pas essayé ça, c'est en fait un simple cast ?.

C'est un compound literal (cast constructor). http://tigcc.ticalc.org/doc/gnuexts.html#SEC81
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é

266

Ok, merci.
Et pour l'autre question svp ! #modouin# mur

267

Folco (./264) :
En fait, je crois que mon erreur était de ne pas déclarer ma variable globalement, ie en-dehors d'une fonction, fût-elle main.
Eh bien oui, c'est ce que je dis en ./257, mais j'ai pas dû être clair grin. Une déclaration qui est dans une fonction est *forcément* une variable locale à cette fonction (d'ailleurs comment le compilateur pourrait-il deviner que c'est censé être global ? il faudrait un mot-clé spécial...)
Par contre je ne comprends pas comment il a réussi à linker si tu n'avais déclaré ta variable globale nulle part confus (peut-être que t'avais pas essayé de linker en fait cheeky)
Effectivement là c'est bon ^^ (à ceci près que tu ne sembles pas avoir utilisé le cast constructor comme dit Kevin ?)

(Sinon si je comprends bien en C90 il faudrait utiliser un workaround avec une variable static qui sert juste à contenir l'initialiseur, un truc comme ça ?)
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#

268

Ben j'ai surtout esasyé de comprendre en m'aidant des tips de chacun, plutôt que de recopier un exemple comme celui de Ximoon. Merci à tous au fait !!! boing

Sally -> Pour l'histoire du scope des fonctions, j'imaginais que le fait de lui dire qu'elle était "extern" lui donnait subitement une portée globale. Mal lu, mal compris. t1 j'ai failli abandonner avec cette saloperie pour continuer un jeu en asm triso




Bon, autre question ! tripo

J'ai des relogements quand je fais ça :
	if (TmpY0 > DrawingData.Curs.y1)
	{
		DrawingData.Curs.y0 = DrawingData.Curs.y1;
		DrawingData.Curs.y1 = TmpY0;
	}

J'essaye donc ce genre de ruse éléphantesque :
	short* TmpPtr;
	if (TmpX0 > DrawingData.Curs.x1)
	{
		TmpPtr = &(DrawingData.Curs.x0);
		*TmpPtr = DrawingData.Curs.x1;
		DrawingData.Curs.x1 = TmpX0;
	}

Malheureusement, j'arrive pas à berner le compilateur, j'imagine qu'il sucre tout simplement le pointeur TmpPtr. grin

J'ai essayé d'autres trucs, d'une finesse tout aussi étonnante :
	if (TmpY0 > DrawingData.Curs.y1)
	{
		*&(DrawingData.Curs.y0) = DrawingData.Curs.y1;
		*&(DrawingData.Curs.y1) = TmpY0;
	}

Pareil, il veut pas marcher le bougre. grin

Un moyen simple d'éviter ces relogements ? Sinon, je rendrai tout simplement "extern" un pointeur sur la structure, et je l'utiliserai un peu partout, il m'avait pas fait de relogement lorsque je passais ce pointeur en argument ici et là.

269

Et si tu prends un pointeur sur DrawingData.Curs avant ton "if" et que tu n'utilises que ce pointeur et plus du tout Drawing.Curs, ça fait quoi ?
Le truc, c'est que tant que tu auras des variables globales, tu auras des relogements, je pense qu'il faudra t'y faire 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.

270

Folco (./268) :
Sally -> Pour l'histoire du scope des fonctions, j'imaginais que le fait de lui dire qu'elle était "extern" lui donnait subitement une portée globale.
Ben la déclaration extern n'est pas dans une fonction, donc elle est effectivement globale, MAIS le truc comme je disais c'est que tu peux très bien avoir une variable locale qui a le même nom qu'une variable globale (mais à part ça elle n'aura rien à voir), et en l'occurrence c'est ce que tu faisais. Par contre si tu n'avais aucune déclaration globale non-extern de ta variable tu aurais dû avoir une erreur au linking, c'est ça que je ne comprends pas.
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#