30
Posted on the 2010-08-30 at 06:56pm Member since 2001-10-28, 7624 posts
D'après la doc de TIGCC/GCC4TI,
int (*x[5])(); An array of pointers to a function which returns an integer

La version avec une taille indéfinie de tableau de cette écriture doit être
int (**x)()

Et un pointeur sur ce truc doit être
int (***x)()


(non testé)
avatar Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.
31
Posted on the 2010-08-30 at 06:57pm Member since 2001-06-18, -31829 post
Ah, ça s'écrit comme ça ? Un pointeur sur un pointeur de fonction en effet... Merci beaucoup !
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
32
Posted on the 2010-08-30 at 06:59pm Member since 2001-06-18, -31829 post
Anéfé, ça marche comme ça :
int pdtlib__ManageArgs (CMDLINE* CmdLine, const char* OptList, void (**FuncList)(), void (*Fallback)())
{
FuncList[OptCount]();
}

Je vais lire le code pour voir si c'est bien ça que j'attends. smile
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
33
Posted on the 2010-08-31 at 02:29pm Member since 2001-06-18, -31829 post
Pwic


J'ai écrit ce proto :
int pdtlib__ManageArgs (CMDLINE* CmdLine, const char* OptList, int (*Callback)(int Status), void (*SwitchFunc)(char Sign), ...)

Puis j'initialise la liste d'arguments variables ainsi :
	va_list FuncList;
va_start(FuncList, SwitchFunc);

Enfin, j'essaye d'appeler une des fonctions contenue dans cette liste variable :
    va_arg (FuncList, (*))(Sign);            // Sign est un char

Mais bon, visiblement, c'est pas comme ça qu'il faut lui parler... Peut-être que ma manière de passer le type à va_arg [(*)] est mauvais ?

C'est la première fois que j'utilise les va_*. J'y avais jamais pensé, mais si j'arrive à faire marcher ça, c'est surpuissant.

ps -> j'ai regardé les macro dans stdarg.h, j'ai... euh... pas tout compris ^^
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
34
Posted on the 2010-08-31 at 02:37pm Member since 2001-06-16, 62374 posts
ouais, tu vas arriver à des __builtin_va_arg grin

c'est quoi cette étoile toute seule entre parenthèses?

35
Posted on the 2010-08-31 at 02:38pm Member since 2001-06-18, -31829 post
C'est, en soi, un pointeur sur une fonction (sans nom). Je sais pas comment lui dire que le type de donnée dans la liste, c'est "pointeur de fonction"
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
36
Posted on the 2010-08-31 at 02:39pm Member since 2001-06-16, 62374 posts
toute fonction implique une paire de parenthèses pour les arguments mon cher.

va_arg (FuncList, (*)())(Sign);

(je crois, hein)
37
Posted on the 2010-08-31 at 02:44pm Member since 2001-06-18, -31829 post
Ca marche pas mieux.
Et même

va_arg(FuncList, void*)(Sign);

ne marche pas :/ Je suis vraiment pas fort pour exprimer en C ce que je pense grin
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
38
Posted on the 2010-08-31 at 02:45pm Member since 2001-06-16, 62374 posts
pour comprendre:

void (*ptr)(void) = va_arg(FuncList, void(*)(void));
ouzencor
void (*ptr)() = va_arg(FuncList, void(*)());

puis:
ptr();

?

donc le type c'est void(*)()

et tu dois pouvoir compacter en

va_arg(FuncList, void(*)())(Sign);

ou avec un cast

(void(*)())va_arg(FuncList,void*)();
39
Posted on the 2010-08-31 at 02:49pm Member since 2001-06-18, -31829 post
Non plus. J'ai essayé au pif des dizaines d'écritures, je suis pas tombé sur la bonne encore triso

Je vais coder un générateur aléatoire d'écritures pifométriques pour me simplifier les choses trioui
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
40
Posted on the 2010-08-31 at 02:51pm Edited by Folco On the 2010-08-31 at 03:02pm Member since 2001-06-18, -31829 post
./38 -> failed && failed :
args.c:71: error: called object '*((FuncList = (FuncList) + 4u) - 4u)' is not a function

Je suis "content" de voir que je ne suis pas le seul à galérer pour mettre en forme une simple écriture. Ca doit pas être évident en fait.
Dire qu'en asm, c'est un movea.l 0(sp,d0.w),a0 // jsr (a0)
Et après on dit que le C est simple et l'assembleur difficile black
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
41
Posted on the 2010-08-31 at 02:58pm Member since 2001-06-16, 62374 posts
non c'est très chiant les pointeurs de fonction en C

je suis trouducuté là sorry

42
Posted on the 2010-08-31 at 03:05pm Member since 2001-06-18, -31829 post
stdarg.h :

#define va_arg(ap,type) (*(type*)((((char*)(ap))+=((sizeof(type)+1)&0xFFFE))-(((sizeof(type)+1)&0xFFFE))))

Si ça peut aider #triprie#
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
43
Posted on the 2010-08-31 at 05:00pm Member since 2001-06-18, -31829 post
Et j'y arrive pas. Faut dire que google(va_arg, function, list) renvoie une plétore de réponses évidemment...
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
44
Posted on the 2010-08-31 at 10:13pm Member since 2001-06-18, -31829 post
Bon, il est 23h passé, tous les poids lourds sont passés ici, et pas de réponse à ./33
J'en conclus que la réponse ne doit pas être si évidente grin
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
45
Posted on the 2010-08-31 at 10:20pm Member since 2001-06-11, 19438 posts
Folco (./33) :
Pwic


J'ai écrit ce proto :
int pdtlib__ManageArgs (CMDLINE* CmdLine, const char* OptList, int (*Callback)(int Status), void (*SwitchFunc)(char Sign), ...)

Puis j'initialise la liste d'arguments variables ainsi :
	va_list FuncList;
va_start(FuncList, SwitchFunc);

Enfin, j'essaye d'appeler une des fonctions contenue dans cette liste variable :
    va_arg (FuncList, (*))(Sign);            // Sign est un char

Mais bon, visiblement, c'est pas comme ça qu'il faut lui parler... Peut-être que ma manière de passer le type à va_arg [(*)] est mauvais ?

C'est la première fois que j'utilise les va_*. J'y avais jamais pensé, mais si j'arrive à faire marcher ça, c'est surpuissant.

ps -> j'ai regardé les macro dans stdarg.h, j'ai... euh... pas tout compris ^^

Tu veux faire quoi ?
Sign = va_arg (FuncList, (char));
(*SwitchFunc) (Sign);
?
46
Posted on the 2010-08-31 at 10:26pm Member since 2001-06-18, -31829 post
Il y a sur la pile une liste d'adresse de fonctions, dont SwitchFunc est le premier élément. Je veux juste pouvoir appeler ces fonctions.

C'est comme si, en asm, je faisais ça :
programme appelant :

pea func3(pc)
pea func2(pc)
pea func1(pc)
jsr lib::ManageArgs

Et dans lib::ManageArgs :
 movea.l x(sp),a0
pea Sign(pc) ; à la rigueur, ça on s'en fout
jsr (a0)

C'est ce movea/jsr que je n'arrive pas à écrire.
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
47
Posted on the 2010-08-31 at 11:10pm Member since 2001-06-11, 19438 posts
48
Posted on the 2010-08-31 at 11:27pm Member since 2001-06-18, -31829 post
hmmm merci beaucoup, encore un truc à apprendre, mais ça a l'air de ressembler à ce que je veux top

C'est con, trois lignes d'asm et c'est réglé, mais j'ai envie de rester portable (juste pour dire que c'est portable ^^)
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
49
Posted on the 2010-09-01 at 08:53am Member since 2001-06-30, 60852 posts
Folco: si tu as un doute sur les warning/errors de gcc & consorts, fait passer ton code dans clang, les messages risquent d'etre moins cryptique ^^ Et si ils le sont, il faut le leur dire ^^
avatar
Proud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
50
Posted on the 2010-09-01 at 09:29am Member since 2001-10-28, 7624 posts
Oui, bonne suggestion.
avatar Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.
51
Posted on the 2010-09-01 at 09:54am Member since 2001-06-16, 62374 posts
mission suivante: trouver/builder/installer/exécuter clang.
52
Posted on the 2010-09-01 at 09:56am Member since 2001-06-18, -31829 post
Ah, un front-end de llvm... M'étonnerait que Debian le propose ce soft, on va voir si la Fée Dora peut me le faire apparaitre.
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
53
Posted on the 2010-09-01 at 10:24am Member since 2001-06-30, 60852 posts
Il est dans ubuntu au moins
avatar
Proud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
54
Posted on the 2010-09-01 at 10:28am Member since 2001-10-28, 7624 posts
Debian testing peut te faire apparaître une version récente de ce soft. Debian stable, en revanche, pas du tout grin

http://clang.llvm.org/get_started.html#build pour compiler clang+llvm toi-même. Peu après la release 2.7, j'avais utilisé le tag 2.7 au lieu du trunk, mais maintenant que la release 2.8 est proche (création de la branche des pre-releases cette semaine), utiliser le trunk est moins aventureux grin
avatar Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.
55
Posted on the 2010-09-01 at 11:05am Member since 2001-06-18, -31829 post
Ouep... rah ça fait chier, ce code est fait pour être compilé par tigcc (_library etc...). il me faudra faire un fake main juste pour sa gueule. C'est quand même casse-couilles. Je me demande si je ne vais pas coder toute cette fonction en asm, ça sera bien plus simple, court et rapide.
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
56
Posted on the 2010-09-01 at 11:53am Member since 2001-06-16, 62374 posts
pourquoi il faudrait un fake main? compiler un programme pour voir l'asm généré ne requiert pas d'édition de liens, donc t'auras pas besoin de main...
57
Posted on the 2010-09-01 at 12:56pm Member since 2001-06-18, -31829 post
c'est vrai, je suis con couic
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
58
Posted on the 2010-09-01 at 02:28pm Member since 2001-06-16, 62374 posts
meuh non, meuh non.
59
Posted on the 2010-09-01 at 04:28pm Member since 2001-06-18, -31829 post
Putain de saloperie de bordel de mes trois.
En fouillant dans mon bouquin, je trouve ça :
void va_start (va_list params, identifiacteur); (stdarg.h)

Cette macro initialise le parcourT (sic) de la liste d'argument variables params, sachant que
identificateur est le nom du dernier argument muet fixe. Celui-ci ne doit pas être de la classe
registre, NI DE TYPE FONCTION, sous peine d'aboutir à un comportement indéterminé.

Fais chier de merde !
J'ai toujours moyen de remplir un handle avec des pointeurs de fonctions, mais si techniquement c'est faisable proprement, esthétiquement c'est immonde, et moralement répréhensible.

Auriez-vous une idée valable ?
avatar <<< Kernel Extremist©®™ >>>
Feel the power of (sint16) !
60
Posted on the 2010-09-01 at 04:36pm Member since 2001-06-16, 62374 posts
int pdtlib__ManageArgs (CMDLINE* CmdLine, int (*Callback)(int Status), void (*SwitchFunc)(char Sign), const char* OptList, ...)

?