120

Ok, donc l'endianness c'est bon à retenir pour les cas généraux, mais codant ti-only ici je m'en fous.

Et les BMP c'est quoi ? Réellement une structure, pas un tableau ? J'ai jamais travaillé dessus en fait ^^ Même avec la SDL, il me suffisait de fournir un fichier en entrée, et la structure qui résultait de la création du sprite était opaque.

121

Folco (./108) :
extern void CommandHelp(char);
extern void CommandAbout(char);
extern void CommandConfig(char);
extern void CommandFlags(char);

J'ai une erreur parce que je ne passe pas de nom à ce paramètre qui ne m'intéresse pas. La solution élégante du C++ qui consiste à ne pas mettre de nom de variable provoque une erreur en C.

Ce n'est pas ici ton problème, mais au moment de la définition.
__attribute__((unused)) est une solution, mais évidemment GCC-only.
Je pourrais aussi essayer de bidouiller le GCC de TIGCC pour qu'il accepte ça, mais ce ne serait pas une solution portable non plus.
Pen^2 (./110) :
public const char* const s1= str+0 ;
public const char* const s2= str+3 ;
public const char* const s3= str+6 ;
public const char* const s4= str+9 ;

Perso, j'utiliserais #define pour ça, ça donne du code beaucoup plus efficace (pas de pointeurs globaux à reloger).
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é

122

Kevin Kofler (./121) :
j'utiliserais #define pour ça, ça donne du code beaucoup plus efficace (pas de pointeurs globaux à reloger).

pencil
A cause des relogements, c'est en effet ce que j'ai implémenté.

Je me demande d'ailleurs pourquoi quand on a ça :
.L0: .asciz "abcde"
gcc s'empresse de rajouter :
Str: .long #.L0

C'est bizarre, il y a toujours moyen de faire un lea/pea Str(pc) avec une chaine, pourquoi toujours créer une adresse absolue pour les chaines ?
Kevin Kofler (./121) :
Ce n'est pas ici ton problème, mais au moment de la définition.

Ben en fait, je ne peux pas définir les fonctions autrement, parce qu'elles sont appelées en tant que Callback par une lib qui ne connait que le proto "void (*func)(char)".
Et quand la lib appelle une fonction, elle n'a aucun moyen de savoir que la fonction n'a pas besoin de ce foutu char ^^

123

Folco (./122) :
C'est bizarre, il y a toujours moyen de faire un lea/pea Str(pc) avec une chaine, pourquoi toujours créer une adresse absolue pour les chaines ?

Parce que c'est la sémantique de:
const char * const x = "foo";
Utilise plutôt:
const char x[] = "foo";
et le pointeur relogé aura disparu.
Ben en fait, je ne peux pas définir les fonctions autrement, parce qu'elles sont appelées en tant que Callback par une lib qui ne connait que le proto "void (*func)(char)".Et quand la lib appelle une fonction, elle n'a aucun moyen de savoir que la fonction n'a pas besoin de ce foutu char ^^

Ce que je dis, c'est juste que c'est la définition le problème et pas la déclaration. Le code que tu as copié passe sans problèmes.
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é

124

Ah merci bien pour les deux tips. smile

125

L'en-tête des fichiers BMP est une structure.

Si tu veux avoir une structure qui ne contient aucun padding (donc 100% telle que tu la déclares), il faut utiliser l'attribut "packed" dans la déclaration de ta stucture (c'est spécifique à GCC, il n'existe pas de façon standard de le faire en C).
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

126

Super merci !

Et c'est supporté par TIGCC : http://tigcc.ticalc.org/doc/gnuexts.html#SEC91_packed

127

Zerosquare (./125) :
L'en-tête des fichiers BMP est une structure.

Si tu veux avoir une structure qui ne contient aucun padding (donc 100% telle que tu la déclares), il faut utiliser l'attribut "packed" dans la déclaration de ta stucture (c'est spécifique à GCC, il n'existe pas de façon standard de le faire en C).



beaucoup de compilo supportent le pragma "pack"

#pragma pack(1)
struct
{
}
#pragma pack()


C'est apriori originaire de VisualC, mais GCC le support bien chez moi.

Et je confirme:
struct test_t { int a; char b; int c; }; struct test_t test = { 10, 20, 30}; struct test_packed_t { int a; char b; int c; } __attribute__((__packed__)); struct test_packed_t test_packed = { 10, 20, 30}; #pragma pack(1) struct test_pragma_t { int a; char b; int c; }; #pragma pack() struct test_pragma_t test_pragma = { 10, 20, 30};

gcc -S test.c -o test.s

donne:

	.file	"test.c"
.globl test
	.data
	.align 4
	.type	test, @object
	.size	test, 12
test:
	.long	10
	.byte	20
	.zero	3
	.long	30
.globl test_packed
	.type	test_packed, @object
	.size	test_packed, 9
test_packed:
	.long	10
	.byte	20
	.long	30
.globl test_pragma
	.type	test_pragma, @object
	.size	test_pragma, 9
test_pragma:
	.long	10
	.byte	20
	.long	30
	.ident	"GCC: (Gentoo 4.4.3-r2 p1.2) 4.4.3"
	.section	.note.GNU-stack,"",@progbits
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.

128

Intéressant, je ne savais pas qu'on pouvait l'utiliser sous GCC (dans la doc, ils disent qu'ils l'ont rajouté pour être compatible avec VC justement). Mais ça reste une extension...
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

129

clang le supporte aussi.
et meme mon gcc 4.2.2 pour ARM

	.file	"test.c"
	.global	test
	.data
	.align	2
	.type	test, %object
	.size	test, 12
test:
	.word	10
	.byte	20
	.space	3
	.word	30
	.global	test_packed
	.type	test_packed, %object
	.size	test_packed, 9
test_packed:
	.4byte	10
	.byte	20
	.4byte	30
	.global	test_pragma
	.type	test_pragma, %object
	.size	test_pragma, 9
test_pragma:
	.4byte	10
	.byte	20
	.4byte	30
	.ident	"GCC: (GNU) 4.2.2"

et meme un gcc 3.4.1 pour arm
test_packed:
	.4byte	10
	.byte	20
	.4byte	30
	.global	test_pragma
	.align	2
	.type	test_pragma, %object
	.size	test_pragma, 12
test_pragma:
	.word	10
	.byte	20
	.4byte	30



Moralité, autant jeter les extention GNU non portable ^^

Squalyl: TG merci
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.

130

Et utiliser une extension VC non portable à la place? sick Clang accepte aussi __attribute__((packed)) si je ne me trompe; parmi les compilateurs courants, il n'y a que VC qui n'accepte que ses propres extensions. bang Quant aux compilateurs moins courants, ils ne gèrent pas forcément ni l'une ni l'autre syntaxe, parce que ni l'un ni l'autre n'est du C standard.
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é

131

132

Kevin Kofler (./130) :
Et utiliser une extension VC non portable à la place? sick Clang accepte aussi __attribute__((packed)) si je ne me trompe; parmi les compilateurs courants, il n'y a que VC qui n'accepte que ses propres extensions. bang Quant aux compilateurs moins courants, ils ne gèrent pas forcément ni l'une ni l'autre syntaxe, parce que ni l'un ni l'autre n'est du C standard.


Les pragma sont un moyen standard de donner des ordres a un compilateur contrairement a des attributs comme le fait GCC.

Si le compilateur ne comprend pas un pragma, il a deux possibilitée :
- Il l'ignore
- Il affiche un warning pour dire "ça je ne connais pas"

Si tu utilise la méthode GCC, un compilo non GCC qui ne comprend pas va faire

"Error - file.c:42: You put a fucking thing here that I don't understand"
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.

133

La sémantique du C originel n'est pas assez riche pour tout un tas de choses que l'on a rencontrées à l'usage, dans les programmes, par la suite...
Et Comme les mécanismes d'extension sémantique du C n'ont pas été définis assez tôt (ou ne vont pas assez loin - #pragma est ancien mais ne va pas assez loin), c'est le bazar: #pragma incompatibles entre compilateurs, __attribute__, 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.

134

(cross -> il dira f***ing embarrassed)

Merci bien pour vos considérations ceci-dit, c'est intéressant. smile



J'ai une question à propos des conventions d'appel :
J'ai un programme P qui appelle une lib L en lui donant l'adresse d'une callback C

Comment ça se passe au niveau des registres ?
Est-ce que la callback attend que les registre a2-a6/d3-d7 aient les même valeurs qu'au moment où P a appelé la fonction de L ?
Ou est-ce que L peut modifier ces registres à sa guise avant d'appeler C ? (du moment qu'elle les restaure avant le return vers P évidemment)

En fait, je ne sais pas où chercher ces fonctions, je ne comprends même pas les expressions __attribute__((stkparm)) ou autres au niveau de la syntaxe C...

135

Folco (./134) :
Comment ça se passe au niveau des registres ?

C'est un appel de fonction comme un autre.
Est-ce que la callback attend que les registre a2-a6/d3-d7 aient les même valeurs qu'au moment où P
a appelé la fonction de L ?

Non.
Ou est-ce que L
peut modifier ces registres à sa guise avant d'appeler C ? (du moment qu'elle les restaure avant le return vers P évidemment)

Oui.
En fait, je ne sais pas où chercher ces fonctions, je ne comprends même pas les expressions __attribute__((stkparm)) ou autres au niveau de la syntaxe C...

__attribute__((stkparm)) veut dire que tous les paramètres sont passés par la pile, c'est la convention d'appel par défaut (mais généralement la moins efficace). Pour un callback, il est important d'utiliser une convention d'appel standard parce que la fonction L doit connaître la convention d'appel utilisée, c'est pour ça qu'on utilise généralement stkparm pour ça (cf. aussi la macro CALLBACK).
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é

136

Est-ce que la callback attend que les registre a2-a6/d3-d7 aient les même valeurs qu'au moment où P a appelé la fonction de L ?

Complément au "Non" de Kevin: dans les callbacks, il faut donc prendre soin de réinitialiser les variables globales dans les registres ou le registre utilisé comme base pour les lectures, écritures et transferts de contrôle (forme de variable globale dans les registres).
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

137

Complément au complément wink:
… sauf si la bibliothèque est en connaissance de la variable globale en question (par exemple, la fonction qsort de TIGCC réserve %a5, utilisé pour OPTIMIZE_ROM_CALLS). Mais par exemple AMS n'est en connaissance de rien. 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é

138

Kevin Kofler (./135) :
(mais généralement la moins efficace)

Il n'y a aucun souci à spécifier qu'on passe les paramètres par registre ? Ca ne pose pas de problème ?
C'est ce qui se fait pour les libs en général ? Y a-t-il des contre-indications ?
Kevin Kofler (./135) :
Pour un callback, il est important d'utiliser une convention d'appel standard parce que la fonction L doit connaître la convention d'appel utilisée, c'est pour ça qu'on utilise généralement stkparm pour ça

Et pourquoi ?
Si j'écris une fonction de lib qui a ce proto : void libfunc (void (*callback) (char a = %d0, int b = %d1, short* c = %a0)) (à la syntaxe près évidemment)
Le programme P appellera L en fournissant l'adresse d'une callback qui aura le même proto, non ? Alors en quoi serait-ce gênant ?


Merci pour tes réponses, déjà.


Lionel, je ne comprends pas sad tu peux préciser par un exemple sommaire stp ?

139

Folco (./138) :
Y a-t-il des contre-indications ?
Ne pas utiliser en cas de grossesse, d'allaitement, chez les enfants de moins de 6 ans...
dehors

avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

140

huhuhu cheeky

141

Folco (./138) :
Si j'écris une fonction de lib qui a ce proto : void libfunc (void (*callback) (char a = %d0, int b = %d1, short* c = %a0)) (à la syntaxe près évidemment)Le programme P appellera L en fournissant l'adresse d'une callback qui aura le même proto, non ? Alors en quoi serait-ce gênant ?

Techniquement, il n'y a aucun souci. C'est juste que l'utilisateur devra déclarer sa fonction avec le même prototype, donc ça pourrait compliquer l'utilisation de ta bibliothèque. C'est plus simple pour l'utilisateur s'il doit juste mettre CALLBACK pour avoir la bonne convention d'appel (et s'il n'utilise pas -mregparm, même pas ça).
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é

142

Ok, merci bien. Je vais rester sur la solution simple alors. smile Même si ça prend de la place et de la vitesse. sad Mais ça le vaut bien. grin
Zerosquare (./139) :
Folco (./138) :
Y a-t-il des contre-indications ?
Ne pas utiliser en cas de grossesse, d'allaitement, chez les enfants de moins de 6 ans...

Euh... mon fils utilise déjà les callbacks avec passage d'arguments... euh... par registre... tu crois que c'est grave ? fear

143

Il a quel âge, déjà ? cheeky
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

144

4 ans dans 2 mois. Mais je déconne, on a pas encore attaqué le callbacks trilangue

145

Est-ce que ce prototype est correct, pour une fonction d'une lib asm appelable en C ?
int pdtlib__CheckFileType(const char* Filename asm("a0"), unsigned char Type asm("d0"), const char* CustomType asm("a1"));
Ai-je besoin d'écrire des __attribute__x quelque part, ou des __ATTR_LIB_x__ ?

146

La plupart des fonctions d'ExtGraph ont des prototypes avec des registres explicites tout à fait similaires à celui-ci, sans attributes. Si tu n'as pas d'autres souhaits spéciaux pour cette fonction (du genre, demander à GCC de vérifier les arguments avec des attributes GCC comme nonnull et format), pas besoin d'attributes.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

147

Ah ok, merci. On va dire que je ne domine pas le domaines des attribute grin J'ai juste suivi ce que PpHd fait dans kernel.h.

148

Si tous tes arguments ont une spécification de registre explicite, tu n'as pas besoin d'autres attributs, les attributs stkparm et regparm ne concernent que les arguments où le registre n'est pas spécifié explicitement.
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é

149

Parfait, merci. smile

150

1. C'est génant si on passe une partie des arguments par registres, une autre par la pile (obligé, avec une va_list) ? Il suffit de ne préciser des registres que là où on en utilise et ça va ?
2. C'est gênant si on utilise des registres >= a2 ?