1

Voila le probleme :
Dans ma fonction _main, j'ai a plusieurs endroits de boites de dialogue avec des DialogAddRequest, comme ça, par exemple :
apd = OSTimerCurVal (APD_TIMER) / 20;
PortRestore ();
sprintf (buf, "%lu", apd);
handle = DialogNewSimple (CALCULATOR ? 200 : 140, CALCULATOR ? 55 : 50);
DialogAddTitle (handle, "APD", BT_OK, BT_CANCEL);
DialogAddText (handle, 10, 16, "Duree avant l'extinction de la calc")
DialogAddRequest (handle, 10, 26, "en s :", 0, 8, 10);
if (DialogDo (handle, CENTER, CENTER, buf, NULL) != KEY_ENTER)
{
HeapFree (handle);
PortSet(backb, 239, 127);
continue;
}
HeapFree (handle);
if ((apd = atol (buf)))
{
OSFreeTimer(APD_TIMER);
OSRegisterTimer(APD_TIMER, 20*apd);
}
PortSet (backb, 239, 127);


Jusque là, rien d'annormal. Par contre, si j'appelle une fonction qui fait des allocations memoire, comme ça :
char dekomp (const char *name)
{
struct hArbre *arbre, *debut, *lecture;
unsigned char *tampon, *n2, *nam, *n;
char a, str[20];
short nbre1 = 0;
unsigned short val, longueur, j;
SYM_ENTRY *SymPtr;
HANDLE handle;
if (!(arbre = HeapDeref (handle = HeapAllocHigh (512*sizeof(struct hArbre)))))
{
ST_showHelp ("Memoire")
return 3;
}
str[0] = 0;
strcpy (str+1, name);
SymPtr = SymFindPtr (str+1 + strlen (str+1), 0);
//a = SymPtr->flags.bits.archived;
nam = HeapDeref (SymPtr->handle);
longueur = *(unsigned short*)nam + 2;
if (memcmp (nam+longueur-6, "KOMP", 4))
{
HeapFree (handle);
ST_showHelp ("Non compresse")
return 4;
}
longueur = *(unsigned short*)(nam+2);
if ((tampon = malloc(longueur)) == NULL)
{
HeapFree (handle);
ST_showHelp ("Memoire")
return 3;
}
ST_showHelp ("Decompression ...")
debut = mk_arbre(arbre, nam+5);
n = nam+6+256*(nam[5] == 1)+512*(nam[5] == 2)+(3*nam[6]+2*nam[7]+2)*(nam[5] == 0);
n2 = tampon;
j = 0;
while (n2-tampon < longueur-1)
{
lecture = debut;
do
{
if (j == 0)
{
nbre1 = *n++;
j += 8;
}
val = nbre1%2;
nbre1 >>= 1;
--j;
if (val == 0)
lecture = lecture->gauche;
else
lecture = lecture->droite;
} while (lecture->gauche != NULL || lecture->droite != NULL);
*n2++ = lecture->valeur;
}
*n2 = nam[4];
a = EM_moveSymFromExtMem (str+1 + strlen (str+1), HS_NULL);
SymPtr = DerefSym (SymAdd (str+1 + strlen (str+1)));
if (!(nam = (unsigned char*)HeapDeref (SymPtr->handle = HeapAlloc(longueur+2))))
{
free (tampon);
HeapFree (handle);
ST_showHelp ("Memoire")
return 3;
}
*(unsigned short*)nam = longueur;
nam += 2;
memcpy (nam, tampon, longueur);
if (a)
EM_moveSymToExtMem (str+1 + strlen (str+1), HS_NULL);
free (tampon);
HeapFree (handle);
return 0;
}

C'est correct, c'est le code de décompression de flib (Komp).

Le probleme, c'est que ça plante si et seulement si le programme est archivé, et seulement si l'allocation se fait dans une fonction autre que _main. Et que si on a appelé une boite de dialogue contenant un champ DialogAddRequest avant.

Voila, c'est bizarre, vu que ça plante pas si c'est pas archivé, je pense que le probleme ne vient pas du code... De plus, ça plante sur ma calcu, et pas sur d'autres...
Y aurait-il quelqu'un qui aurait une idée ?
Si vous voulez tester le prog, ou voir le source complet, c'est ici :http://sciences-ti89.guilc.firstream.net/archives/tiex.zip
Merci
Mon site perso : http://www.xwing.info

2

C'est un bogue de AMS.
Pour le "corriger", il faut rechercher ton programme dans la VAT (avec les ROM_CALLs adaptés), marquer le symbole twin de ton programme comme utilisé/caché (il suffit de mettre le flag "hidden"), et le décacher quand tu as fini.
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é

3

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é

4

OK, merci. love J'avais beau chercher dans mon code, y avait rien qui foirait...
Mon site perso : http://www.xwing.info

5

C'est incroyable que ce genre de bugs reste dans les dernières releases d'AMS...
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

6

En effet, AMS devrait automatiquement marquer les programme qu'il execute comme "in use" (les cacher).
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é

7

C'est pas la dernière, c'est la 2.05. il semble que ça plante pas sur 2.08 (dixit croustx).
Mon site perso : http://www.xwing.info