1

J'ai un probleme dans une routine qui cherche en mémoire tout les fichiers de type programme/fonction et commencant par "(c)DS" (pour indiquer que c'est un script pour moi) et je ne trouve pas l'erreur, si quelqu'un veut bien m'aider là-dessus ça serait sympa smile

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

2

si tu mettais des commentaires dans ton code, ça aiderai énormément.

c'est quoi exactement le problème ?

- tu n'arrives pas à trouver ta signature à tous les coups
- ça bug (crash de la Ti )

3

je vois tu traites les 2 cas de figures :
code source tokénéisé ou non.
l'erreur c'est dans les 2 cas ou seulement un ?
un peu plus de précision sur le bug ça aiderait

au fait c'est pas prudent il me semble, ce genre d'écriture à la ligne 35 :
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.

tu crées un tableau de la liste des noms de tes fichiers signés en utilisant une seul variable de type sym_entry dont le contenu est écrasé à chaque itération. Il me semble que l'adresse du pointeur que tu utilises ne varie pas, seulement son contenu.
tous les élément de ton tableau indique successivement la même adresse, dont le contenu est successivent écrasé

c'est de là que provient le problème.
je ne vois pas de 'strncpy' pour recopier le nom des variables dans ton tableau

4

Not Found
The requested document was not found on this server.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

Qu'est que c'es que ça Vertyos !!!!!!!!!!!!!!!
Je vois ton problème et je vois aussi la solution :
que fpgforce balance diectement son source dans le topic.

6

Si il avait balance sa source dans le topic, tu aurais pas pu écrire "pas prudent il me semble, ce genre d'écriture à la ligne 35"

7

(au moins on a pas du tout l'impression que vs vs prenez la tête pr une source)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

8

Un certain nombre de softs de TICT utilisent des routines similaires, par exemple le FAT-Engine.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

9

Je vous redonne la source avec un peu plus de commentaires,
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 ; }

10

Merci pour les commentaires.
je présume que mes hypothèses n'ont pas donné lieu à confirmation vu qu'il n'y pas de reponses.

Dans quoi tu récupères les noms des variables ?
vu que tu ne conserve que l'addresse 'symentry->name' à chaque itération

11

J'ai regarde vite fait, et j'ai vu une betise : p et q faut que tu les affectes dans la boucle.

12

l'erreur c'est dans les 2 cas ou seulement un ? un peu plus de précision sur le bug ça aiderait
L'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 :
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.
Non p++ se fait bien après la condition.

13

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à smile
Dans quoi tu récupères les noms des variables ? vu que tu ne conserve que l'addresse 'symentry->name' à chaque itération
Je viens de voir ça en effet, merci je vais essayer de corriger ça ce soir.

14

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à smile

tu peux tourner en boucle indefiniment :
while (symentry != NULL)
{
  if (*q != FUNC_TAG)
    continue;
.....
}

15

Ah en effet, autant pour moi smile
j'ai remplacé le while par;
for (; symentry!=NULL; symentry=SymFindNext())

Je vais maintenant regarder pour le nom smile

16

fpgforce> ca ne suffit pas : il faut aussi mettre a jour p et q

17

Ouai j'ai modifié deja toute à l'heure smile

18

Voila la derniere mouture du code, je ne sais pas trop si c'est bon au niveau algorithmique mais ce qui es sur c'est que ça me bousille la VAT, durant l'execution tout se passe "bien" (pas d'erreur mais j'arrive pas a récuperer la liste par contre) mais ensuite quand je vais dans le var-link je vois plus rien triso et même dans l'ecran home, l'historique a l'air d'avoir pris un coup aussi ^^ 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 ; }

19

2 choses :
- vérifier que script_list est alloué d'une taille suffisante
- SYM_ENTRY * symentry = SymFindFirst (NULL, FO_RECURSE | FO_SKIP_TEMPS) ;

20

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:
main/der EXPR 12 (archivé)
qui doit correspondre à mon programme derivee. Il n'y a aucun repertoire dans le var-link.

21

fpgforce :
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.
C'est vrai, mais c'est mieux NULL, parce que "" n'est meme pas un SYMSTR.
[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:
main/der EXPR 12 (archivé)
qui doit correspondre à mon programme derivee. Il n'y a aucun repertoire dans le var-link.
tu ecris en memoire la ou il faut pas tongue
j'ai vu le autre gros pb :
current_var_name = strcat(strcat(SymFindFolderName(),"\"),symentry->name);
strcat n'alloue rien, il recopie. D'ou "main/der".
fait plutot :
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);
...



22

Merci pour cette correction smile
Je n'ai plus le probleme de la VAT mais je n'arrive toujours pas a detecter les scripts apparement...

23

Un pointeur sur char n'est pas un tableau de caractère. ce n'est pas comme en TI basic.
En C tu dois allouer un tableau de char dont tu connait la taille maxi.
Ensuite seulement tu pourra copier une chaîne dans chaque case du tableau de caractère.
Soit tu utilise 'strncpy','strcopy' ou tu le fait en remplissant individuellement chaque case du tableau.

char *variable ne peut acceuillir que l'addresse d'une chaine ( qui a été précédemment allouée ) et pas une chaîne.

1-> cette façon de concaténé n'est pas valide en C. tu dois toujours alloué un buffer pour stocker le résultat d'une concaténation.
lit bien la doc sur 'strcat'.
current_var_name = strcat(strcat(SymFindFolderName(),"\"),symentry->name) ;

il faut d'abord copier le nom du répertoire dans ton buffer avant de concatener à la suite '\' puis 'symentry->name'.


ceci non plus n'est pas valable, il faut utiliser 'strncpy' ou 'strcopy' :
script_list[script_count] = current_var_name ;

De plus on ne sait pas si tu as alloué 'script_list'

je te conseille de lire un tuto C sur l'allocation des chaînes ou tableau; tu y vera mieux après.

on est tous passé par là. c'est chiant mais il faut le faire.

Voici commment je procède dans 'MyLiB' pour recupérer la liste des fichiers. c'est un extrait de code que je n'expliquerai pas :
     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();           }

24

Ouai ok mais ton code est tellement illisible que ça m'aide pas des masse tongue
Ceci dit j'ai réglé le probleme des chaines grace à Hibou smile

25

Tien, comment n'ai pas vu le post de hibou avant de poster confus

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.

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é.


Au fait pour debogguer ton prog , tu n'as qu'a afficher les 3 caractères que tu testes avec 'printf' pour vérifier.

Il a un truc que je pige pas :
Si tu signes un fichier en mettant un commentaire sur la 1ère ligne, pourquoi fais-tu une boucle 'while' sur chaque fichier au lieu d'un 'if' tout simplement.

q = GetFuncPrgmBodyPtr (q) ;
while (q >= p) // On vérifie qu'on ne sort pas du fichier
{... }


Regarde bien la structure des variables TIOS fourni par TI 'Developer Guide Book', il n'y besoin d'aucun while pour tester si la 1ère ligne d'un programme commence par (c)DS. quelques 'if' suffisent largement.


Il faut juste vérifier que le fichier contient plus de 3 caractères puis les tester un par un.


C'est pas our en rajouter mais tu donnes l'impression de débuter sous TIGCC.

26

andoh_wilfried :
Tien, comment n'ai pas vu le post de hibou avant de poster confus
ca s'apelle un cross ^^
j'ai tape plus vite que toi
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.

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é.
tout a fait : 18. Mais j'ai pris 20 mais on peut mettre 18.
Et oui, ca doit etre automatique pour tout programmeur : malloc => free

27

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 tongue
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.

28

fpgforce
:
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 tongue
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.
ah ok.
Donc effectivement reprecisons : n'oublie pas de faire une boucle de free pour desallouer ton tableau : autant de free qu'il y a de malloc

29

Je sais ça, la boucle for est deja faite depuis ton post pour les chaines ^^

30