1

Vala. J'ai un problème qui me bloque completement, tant qu'il est pas résolu je peux pas avancer sad
J'ai déjà posté dans C, mais ça sera pê mieux ici après tout...

Donc, je voudrais que mon programme soit capable de renvoyer une liste Ti-basic de chaines de caractères : {"Chaine1","Chaine2"}...

Voilà qq portions de code (j'ai bcp détaillé parceque je reconnais que mes variables sont parfois peu compréhensibles) :

SYM_ENTRY *var_sym; // Fonction qui, normalement, donne un a un les noms des dossiers présents
var_sym = SymFindFirst(NULL,4); // Cherche le 1er dossier de la ti
while(var_sym!=NULL)
{
exe_adds(var_sym->name); // L'ajoute à la liste grace au programme (voir + loin)
var_sym=SymFindNext(); // Cherche le dossier suivant
}


Voilà la fonction exe_adds :

void exe_adds(char *valeur) // Sensé ajouter 1 pointeur de chaine dans le tableau
{
tbl_retstr[var_retstr++]=valeur; // Le pointeur est stocké dans le tableau, puis on incremente le rang pour l'élement suivant
}


Et enfin, à la fin du programme quand tous les dossiers ont été entrés dans la liste :

void exe_rets(char *variable) // On stockera le tableau dans une liste TiOS de nom 'variable'
{
ESI backup; // Pour mesurer plus tard la taille de la liste en octets
if(var_retstr>0) // Si la liste contient des éléments
{
backup=top_estack;
push_quantum(END_TAG);
for(var_for=var_retstr;var_for>0;var_for--) // On traite a l'envers les éléments de la liste
{
push_ANSI_string(tbl_retstr[var_for-1]); // On les push un a un sur le stack
}
push_quantum(LIST_TAG);
SYM_ENTRY *var_sym = DerefSym(SymAdd(variable)); // On crée la variable
if(var_sym) // Et on la fixe à partir du stack
{
ptr_argument=(char*)HeapDeref(var_sym->handle=HeapAlloc(top_estack-backup+2));
*(unsigned short *)ptr_argument=top_estack-backup;
memcpy(ptr_argument+2,backup+1,top_estack-backup);
}
top_estack=backup;
}
}


Et donc ça ne marche pas, j'obtient ça : {"",""...} avec autant d'élements que de dossiers bien sur...
Pourtant quand je fait exe_adds(chaine), ça marche. 'chaine' est de type char *

Voilà, si qqun voit où est (sont) la (les) erreur(s)...
[edit]Edité par Bob 64 le 09-03-2002 à 19:32:53[/edit]
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

2

essaie ca :

SYM_ENTRY *var_sym;
var_sym = SymFindFirst(NULL,4);
push_END_TAG();
while(var_sym!=NULL)
{
push_ANSI_string(var_sym->name);
var_sym=SymFindNext();
}
push_LIST_TAG();
Fiou.

3

Merci, mais en fait le but c'est de pouvoir retourner une liste avec d'autres éléments que la liste des dossiers...
En fait je dois forcément passer par exe_adds pour stocker tout, puis à la fin du programme créer la liste.

Mais merci qnd même wink
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

4

Bon j'ai avancé, maintenant j'obtient une liste, mais elle qu'un seul dossier en x exemplaires, x étant le nombre de dossiers de la ti.

Par exemple, si j'ai comme dossiers : main,jeux,unios
Alors j'aurais comme liste : {"unios","unios","unios"

Pkoi ????
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

Bon, je passe des heures dessus à ne rien comprendre...
En ne laissant que ce qui est important, voilà ce que j'ai :

while(var_sym!=NULL) // Boucle qui entre dans la liste tous les dossiers
{
strcpy(ptr_chaine,var_sym->name); // On copie la chaine dans un pointeur
var_sym=SymFindNext();
printf_xy(20,20,ptr_chaine,A_REPLACE); // Cette ligne permet de vérifier le pointeur (voir screen)
ngetchx();
exe_adds(ptr_chaine); // On ajoute le pointeur à la suite de la liste (voir + bas)
}


Et la fonction exe_adds :

void exe_adds(char *valeur)
{
tbl_rettyp[var_retcnt]=2; // Ça c'est pour autre chose ds le programme, c'est pas important
tbl_retlst[var_retcnt++]=valeur; // On ajoute le pointeur à la suite de la liste
}


Donc, normalement, il ajoute les dossiers un par un, mais je vérifie quand même avec la fonction printf_xy. J'obtient ça :

Vertel1.gif

Et voilà. D'après les pointeurs on a bien ajouté main & unios à la liste, mais pkoi est-ce que la liste à la sortie ne contient que des "unios" confusconfusconfus
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

6

t'obtiens une croix rouge ? confus
c'est étrange, en effet triso
*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & sabrina

7

Actualise la page, le screen marche très bien tongue
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

8

tt à l'heure ça ne s'affichait po tongue
*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & sabrina

9

Bon au lieu de t'amuser avec mon screen, t'as pas une réponse ? Ce truc me bloque completement depuis hier sad
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

10

je peux pas t'aider je ne connais rien à la vat sad
*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & sabrina

11

Personne ne peut // veut m'aider sadsadsad
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

12

Snif c'est triste que personnepuisse t'aider.... sad
avatar
Webmaster du site aB-)(-AwS http://www.ab-aws.fr.st/

13

rotflrotflrotflrotflrotflrotflrotfl
Tu vois pa ton bug grin C'est simple poutant !
Il faut :
void exe_adds(char *valeur) 
      { 
      tbl_rettyp[var_retcnt]=2; // Ça c'est pour autre chose ds le programme, c'est pas important 
      tbl_retlst[var_retcnt]= malloc(strlen(valeur));
      strcpy(tbl_retlst[var_retcnt++],valeur); // On ajoute le pointeur à la suite de la liste 
      } 


       void exe_rets(char *variable) // On stockera le tableau dans une liste TiOS de nom 'variable' 
       { 
       ESI backup; // Pour mesurer plus tard la taille de la liste en octets 
       if(var_retstr>0) // Si la liste contient des éléments 
       { 
       backup=top_estack; 
       push_quantum(END_TAG); 
       for(var_for=var_retstr;var_for>0;var_for--) // On traite a l'envers les éléments de la liste 
       { 
       push_ANSI_string(tbl_retstr[var_for-1]); // On les push un a un sur le stack 
       free(tbl_retstr[var_for-1]);
       } 
       push_quantum(LIST_TAG); 
       SYM_ENTRY *var_sym = DerefSym(SymAdd(variable)); // On crée la variable 
       if(var_sym) // Et on la fixe à partir du stack 
       { 
       ptr_argument=(char*)HeapDeref(var_sym->handle=HeapAlloc(top_estack-backup+2)); 
       *(unsigned short *)ptr_argument=top_estack-backup; 
       memcpy(ptr_argument+2,backup+1,top_estack-backup); 
       } 
       top_estack=backup; 
       } 
       } 


Ca devrait meiux marcher la.

14

"C simple pourtant"
> Bah pour toi oui, mais... roll
Enfin c pas si simple puisque jusqu'a maintenant personne n'a pu m'aider...

En tout cas merci, j'avais trouvé une autre solution mais je v quand même essayer celle là !
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

15

lol, j'ai mm pas vu les changements qu'il a apporté grin
avatar
納 豆パワー!
I becamed a natto!!!1!one!

16

le malloc(strlen(valeur)) et le strcpy().

en fait moi je copiais seulement des pointeurs dans mon tableau, et ils deviennent invalides quand je capture les dossiers//fichiers (les pointeurs sont annulés au SymFindNext). Alors que la on copie les chaines donc ça marche.

Mais entre temps, j'ai essayé d'envoyer directement les chaines sur le stack, et ça marche oui
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)