Boo
Folco - Posté le 04/09/2010 à 22:59 Membre depuis le 18/06/2001, 29841 messages
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.
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
Kevin Kofler - Posté le 05/09/2010 à 00:36 Membre depuis le 10/06/2001, 34857 messages
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 (fr/en), MobiFiles (de)
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é
Folco - Posté le 05/09/2010 à 00:40 Membre depuis le 18/06/2001, 29841 messages
Kevin Kofler (./121) :
j'utiliserais #define pour ça, ça donne du code beaucoup plus efficace (pas de pointeurs globaux à reloger).

#crayon#
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 ^^
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
Kevin Kofler - Posté le 05/09/2010 à 00:54 Membre depuis le 10/06/2001, 34857 messages
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 (fr/en), MobiFiles (de)
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é
Folco - Posté le 05/09/2010 à 01:27 Membre depuis le 18/06/2001, 29841 messages
Ah merci bien pour les deux tips. smile
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
Zerosquare - Posté le 05/09/2010 à 01:34 Membre depuis le 27/04/2006, 43263 messages
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).
avatarZeroblog

« 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
Folco - Posté le 05/09/2010 à 01:42 Membre depuis le 18/06/2001, 29841 messages
Super merci !

Et c'est supporté par TIGCC : http://tigcc.ticalc.org/doc/gnuexts.html#SEC91_packed
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
Godzil - Posté le 15/09/2010 à 14:51 - Edité par Godzil le 15/09/2010 à 14:59 Membre depuis le 30/06/2001, 57148 messages
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©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
Zerosquare - Posté le 15/09/2010 à 14:57 Membre depuis le 27/04/2006, 43263 messages
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...
avatarZeroblog

« 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
Godzil - Posté le 15/09/2010 à 15:03 - Edité par Godzil le 15/09/2010 à 16:12 Membre depuis le 30/06/2001, 57148 messages
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©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
Kevin Kofler - Posté le 15/09/2010 à 15:26 Membre depuis le 10/06/2001, 34857 messages
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 (fr/en), MobiFiles (de)
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é
squalyl - Posté le 15/09/2010 à 16:11 Membre depuis le 16/06/2001, 59760 messages
"moraliter" #sick#
Godzil - Posté le 15/09/2010 à 16:14 Membre depuis le 30/06/2001, 57148 messages
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©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
Lionel Debroux - Posté le 15/09/2010 à 17:11 Membre depuis le 28/10/2001, 7565 messages
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.
Folco - Posté le 15/09/2010 à 17:16 Membre depuis le 18/06/2001, 29841 messages
(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...
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
Kevin Kofler - Posté le 15/09/2010 à 17:51 Membre depuis le 10/06/2001, 34857 messages
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 (fr/en), MobiFiles (de)
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é
Lionel Debroux - Posté le 15/09/2010 à 18:16 Membre depuis le 28/10/2001, 7565 messages
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.
Kevin Kofler - Posté le 15/09/2010 à 19:10 Membre depuis le 10/06/2001, 34857 messages
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 (fr/en), MobiFiles (de)
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é
Folco - Posté le 15/09/2010 à 19:17 Membre depuis le 18/06/2001, 29841 messages
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 ?
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
Zerosquare - Posté le 15/09/2010 à 19:22 Membre depuis le 27/04/2006, 43263 messages
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#

avatarZeroblog

« 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
Pen^2 - Posté le 15/09/2010 à 19:44 Membre depuis le 10/06/2001, 30249 messages
huhuhu cheeky
Kevin Kofler - Posté le 15/09/2010 à 21:23 Membre depuis le 10/06/2001, 34857 messages
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 (fr/en), MobiFiles (de)
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é
Folco - Posté le 15/09/2010 à 22:56 Membre depuis le 18/06/2001, 29841 messages
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 ? #peur#
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
Zerosquare - Posté le 15/09/2010 à 23:11 Membre depuis le 27/04/2006, 43263 messages
Il a quel âge, déjà ? cheeky
avatarZeroblog

« 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
Folco - Posté le 15/09/2010 à 23:15 Membre depuis le 18/06/2001, 29841 messages
4 ans dans 2 mois. Mais je déconne, on a pas encore attaqué le callbacks #trilangue#
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
Folco - Posté le 20/09/2010 à 16:26 - Edité par Folco le 20/09/2010 à 17:53 Membre depuis le 18/06/2001, 29841 messages
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__ ?
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
Lionel Debroux - Posté le 20/09/2010 à 16:41 Membre depuis le 28/10/2001, 7565 messages
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.
Folco - Posté le 20/09/2010 à 16:43 Membre depuis le 18/06/2001, 29841 messages
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.
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
Kevin Kofler - Posté le 20/09/2010 à 17:13 Membre depuis le 10/06/2001, 34857 messages
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 (fr/en), MobiFiles (de)
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é
Folco - Posté le 20/09/2010 à 17:53 Membre depuis le 18/06/2001, 29841 messages
Parfait, merci. smile
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
Folco - Posté le 20/09/2010 à 23:13 Membre depuis le 18/06/2001, 29841 messages
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 ?
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.