
Le code est ici: http://rafb.net/paste/results/3Frt5H81.html

Not Found
The requested document was not found on this server.
short search_scripts (char ** script_list)
{
short script_count = 0 ;
SYM_ENTRY * symentry = SymFindFirst ("", FO_RECURSE | FO_SKIP_TEMPS) ;
ESI p = HeapDeref(symentry->handle)+2 ;
ESI q = HToESI(symentry->handle) ;
while (symentry != NULL)
{
if (*q != FUNC_TAG)
continue;
if (!(*(q-1)&8)) // Si tokenise alors...
{
q = GetFuncPrgmBodyPtr (q) ;
while (q >= p) // On vérifie qu'on ne sort pas du fichier
{
while (q >= p && *q != NEXTEXPR_TAG && *q != NEWLINE_TAG)
q-- ;
q-=2 ;
if (*q == COMMENT_TAG && !*(q-1) && !*(q-2) && *(q-3)=='S' && *(q-4) =='D' && !*(q-5))
{
script_count++ ;
script_list[script_count] = symentry->name ;
break;
}
}
}
else // Sinon, non-tokenise
{
while (q >= p) // On vérifie qu'on ne sort pas du fichier
{
while (q >= p && *p != '\r' && *p != ':')
p++ ;
if (*++p == 169 && *(p+1) == 'D' && *(p+2) == 'S' && *(p+3) == '\r')
{
script_count++ ;
script_list[script_count] = symentry->name ;
break ;
}
}
}
symentry = SymFindNext () ;
}
return script_count ;
}
l'erreur c'est dans les 2 cas ou seulement un ? un peu plus de précision sur le bug ça aideraitL'erreur est dans n'importe quel cas, avec ou sans programme dans la calculatrice.
au fait c'est pas prudent il me semble, ce genre d'écriture à la ligne 35 :Non p++ se fait bien après la condition.
vaudrait-il pas mieux faire p++ avant la condition ?; bon si on connaît le sens de l'évalution de l'expression, c'est sure on ne risque rien.
J'ai regarde vite fait, et j'ai vu une betise : p et q faut que tu les affectes dans la boucle.Non non l'algo est bon de ce coté là
Dans quoi tu récupères les noms des variables ? vu que tu ne conserve que l'addresse 'symentry->name' à chaque itérationJe viens de voir ça en effet, merci je vais essayer de corriger ça ce soir.
fpgforce
:J'ai regarde vite fait, et j'ai vu une betise : p et q faut que tu les affectes dans la boucle.Non non l'algo est bon de ce coté là
while (symentry != NULL) { if (*q != FUNC_TAG) continue; ..... }
for (; symentry!=NULL; symentry=SymFindNext())
short search_scripts (char ** script_list)
{
short script_count = 0 ;
char * current_var_name ;
SYM_ENTRY * symentry = SymFindFirst ("", FO_RECURSE | FO_SKIP_TEMPS) ;
ESI p , q;
for (; symentry!=NULL; symentry=SymFindNext())
{
p = HeapDeref(symentry->handle)+2 ;
q = HToESI(symentry->handle) ;
current_var_name = strcat(strcat(SymFindFolderName(),"\"),symentry->name) ;
if (*q != FUNC_TAG)
continue;
if (!(*(q-1)&8)) // Si tokenise alors...
{
q = GetFuncPrgmBodyPtr (q) ;
while (q >= p) // On vérifie qu'on ne sort pas du fichier
{
while (q >= p && *q != NEXTEXPR_TAG && *q != NEWLINE_TAG)
q-- ;
q-=2 ;
if (*q == COMMENT_TAG && !*(q-1) && !*(q-2) && *(q-3)=='S' && *(q-4) =='D' && !*(q-5))
{
script_count++ ;
script_list[script_count] = current_var_name ;
break;
}
}
}
else // Sinon, non-tokenise
{
while (q >= p) // On vérifie qu'on ne sort pas du fichier
{
while (q >= p && *p != '\r' && *p != ':')
p++ ;
if (*++p == 169 && *(p+1) == 'D' && *(p+2) == 'S' && *(p+3) == '\r')
{
script_count++ ;
script_list[script_count] = symentry->name ;
break ;
}
}
}
}
return script_count ;
}
main/der EXPR 12 (archivé)qui doit correspondre à mon programme derivee. Il n'y a aucun repertoire dans le var-link.
fpgforce :C'est vrai, mais c'est mieux NULL, parce que "" n'est meme pas un SYMSTR.
Ok, pour la taille du script_list ça devrait être bon et je vais corriger cette histoire aussi, mais apparement selon la doc de TIGCC le premier argument est tout simplement ignoré lorsqu'on utilise FO_RECURSE.
[edit] Precision: je viens de tester avec la correction de Hibou et je vois apparaitre ceci dans le var/link quand j'execute le code:tu ecris en memoire la ou il faut pasmain/der EXPR 12 (archivé)qui doit correspondre à mon programme derivee. Il n'y a aucun repertoire dans le var-link.
sprintf(current_var_name,"%s\%s",SymFindFolderName(),symentry->name); ... script_list[script_count] = malloc (20 * sizeof(char)); strcpy(script_list[script_count],current_var_name); ...
case fn_fold: {
a=!((short)(*(ArgS[0].str)));
SYM_ENTRY *symptr=SymFindFirst((a?NULL:SYMSTR(ArgS[0].str)),(a?(!ArgN[0]?FO_SKIP_TEMPS:0):FO_SINGLE_FOLDER));
strcat(ArgS[0].str,"\");
b=ArgS[0].len+1;
while(symptr) {
FilePtr=(char *)HeapDeref(symptr->handle);
VatSize=*(short *)FilePtr;
VatType=peek(FilePtr+VatSize+1);
if(a || !ArgN[1] || VatType==(unsigned char)ArgN[1]) {
if(!a && ArgN[0]) {
*(ArgS[0].str+b)='\0';
strcat(ArgS[0].str,symptr->name);
push_zstr(ArgS[0].str);
}
else push_zstr(symptr->name);
}
symptr=SymFindNext();
}
q = GetFuncPrgmBodyPtr (q) ;
while (q >= p) // On vérifie qu'on ne sort pas du fichier
{... }
andoh_wilfried :ca s'apelle un cross ^^
Tien, comment n'ai pas vu le post de hibou avant de poster![]()
au fait hibou , j'espère que tu lui as dit de faire une boucle for avec 'free' pour chaque élément du tableau pour libérer l'espace en sortant du programme.tout a fait : 18. Mais j'ai pris 20 mais on peut mettre 18.
je ne vois pas de changement dans l'allocation de 'current_var_name'; je suppose que ça été fait comme ceci
current_var_name[18] . la taille maxi oqp par un nom de variable est de 18 si le nom du répertoire est précisé.
C'est pas our en rajouter mais tu donnes l'impression de débuter sous TIGCC.La majeure partie de cette routine a été ecrite par Kevin_Kofler
fpgforceah ok.
:C'est pas our en rajouter mais tu donnes l'impression de débuter sous TIGCC.La majeure partie de cette routine a été ecrite par Kevin_Kofler![]()
Sinon en effet ça pas longtemps que je code en C, environ 1 mois et je l'ai "appris" en environ 5 jours le C.