Regarde le topic sur le launcher dans la FAQ. Je crois que le code est différent de celui que tu utilises...
Pour le fait que ça soit exécuté dans le ghost space, je ne connais pas la réponse...
Il y a d'autres moyens de lancer un programme avec arguments (regarde les fonctions d'estack.h). En plus, il y a un gros bug dans ton deuxième bout de code: tu ne mets pas de TRY/ONERR/ENDTRY autour d'un call à une fonction du TI-BASIC (si jamais une erreur est lancée, ça fait au minimum un gros memory leak) !
joelt49 Le 02/09/2002 à 23:24Edité par joelt49 le 02/09/2002 à 23:30 Kevin: Je suis étonné: ta routine est buggée!
ESI top_estack_backup=top_estack;
SYM_ENTRY* symentr;
push_END_TAG();
push_expr_quantum (SYMSTR(str2), STR_TAG); /* workaround parce que push_string de AMS est bogué */
symentr = SymFindPtr (SYMSTR ("hibtext"), 0);
if (!symentr)
//le fichier n'était pas trouvé
else
{
handle = symentr->handle;
if (HeapGetLock (handle)
{
src = HeapDeref (handle);
handle = 0;
}
else
src = HLock (handle);
len = *(unsigned short*)src;
EX_patch (src + 0x40002, src + len + 0x3FFFF);
asm ("movem.l %a2-%a6/%d3-%d7,-(%a7)")
ASM_fastcall (src + 0x40002);/*ASM_fastcall parce qu'il faut des nop's*/
asm volatile ("nop; nop; nop; nop;")/*il les faudra si le prog appelé a un "#define RETURN_VALUE"*/
asm ("movem.l (%a7)+,%a2-%a6/%d3-%d7")
if (handle)
HeapUnlock (handle);
top_estack=top_estack_backup;
}
Parce que handle devient libre même s'il n'était pas avant ta routine, et ça peut planter une calc.
EDIT: J'avais oublié de voir si le fichier était trouvé.
Je ne sais pas pour le reste, mais ça, c'est faux:
>*(fold+c) = (char *)malloc (strlen (SymPtr->name) + 1);
>strcpy (*(fold+(c++)), SymPtr->name);
On ne peut pas utiliser strlen ni strcpy ici parce que la chaîne ne sera pas terminée par un 0 si le nom fait exactement 8 caractères!
Je propose (j'utilise la notation fold[c] plutôt que *(fold+c), c'est plus lisible):
fold[c]=malloc(9);
fold[c][8]=0;
strncpy(fold[c++],SymPtr->name,8);
guilc Le 03/09/2002 à 20:28 Vala : TIGCC.chm::/vat_SymFindPtr.html
guilc Le 04/09/2002 à 15:49 Voila, j'ai trouvé mon probleme, c'est assez bizarre, mais c'est à cause des realloc :
si j'alloue en une seule fois, a l'EXTERIEUR de la fonction (que je rappelle) :
unsigned short folder (char **fold)
{
short c = 0;
SYM_ENTRY *SymPtr;
SymPtr = SymFindFirst (NULL, 0);
while (SymPtr)
{
fold = (char **)realloc (fold, (c+1) * sizeof (*fold));
fold[c]=malloc(9);
fold[c][8]=0;
strncpy(fold[c++],SymPtr->name,8);
SymPtr = SymFindNext ();
}
return c;
}
Ca marche.
Quite strange isn't it ? Il me semble pourtant que ce que je fais est autorisé en C !
Est-ce qu'il serrait possible que ce soit un bug de TIGCC, ou j'ai pas vu une grosse connerie dans mon code ?
bylos Le 04/09/2002 à 15:59 Pour ce ki est de la recuperation des noms de vars, j'avais créé un piti prog ki stockait tout ça dans un tableau et ki les affichait dans un popup, j'avais fait ça pour me familiariser avec la VAT, je peut t'envoyer les sources si tu veux...(donne moi juste une adresse où envoyer)...le code est pas optimiser du tout vu ke je debute en C, mais tu pourrais voir ce ki colle pas avec le tien..
guilc Le 06/09/2002 à 21:55 Pour revenir au sujet d'origine du topic : comment on lance un prog basic (sans NG_Execute). J'ai vu dans tictex, il copie le nom du prog dans la ligne de commande de home, ça ok, mais comment on la valide, la ligne de commande ?
Et y a t il une autre methode ?
Le problème, c'est que pour la manipulation du trap 11, il faut connaître l'ASM (il faut manipuler des registres utilisés par AMS pour changer l'adresse du programme ASM qu'AMS va lancer).
Des trucs d'aussi bas niveau ne seront peut-être pas intégrés dans TIGCC...
Je ne vois rien de méchant ici. De toute façon, tu n'as pas pour habitude de faire des posts méchants.
Et je pense sincèrement que ça ne sera pas intégré... C'est un peu dangereux, la trap B étant la trap pour travailler avec la Flash/l'archive. Si le programmeur fait une petite erreur, il risque d'y avoir des *petits* problèmes. La calculette risque de faire entendre 'le bruit étrange que fait une touche ON qui ne réveille plus la bête' (ou un truc comme ça, je crois que c'est ExtendeD qui avait dit ça).