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

J'avais beau chercher dans mon code, y avait rien qui foirait...