1

J'en suis tjrs à vouloir renvoyer une liste ti-basic de valeurs, mais je ne peux pas utiliser
#define return_value var

Donc Kevin m'a passé un algo qui marche nickel, mais qui ne permet d'envoyer que des int, pas de chaines. J'ai essayé de completer et c un desastre sad

Résumé :

Unsigned int retour[99];

void exe_adds(char *string) // Pour ajouter une chaine dans la liste à renvoyer
{
retour[rng_return++]=string;
}

(si j'utilise strcpy(retour[rng_return++],string); comme indiqué dans l'aide, ça me fait une protected memory violation...

Bon et puis + loin :

push_quantum(END_TAG);
for(tmp=rng_return;tmp>0;tmp--)
{
type=retour[tmp-1];
if(!strlen(type)) push_ANSI_string(retour[tmp-1]);
else push_longint(retour[tmp-1]);
}
push_quantum(LIST_TAG);


donc normalement ça devait reperer quels sont les élements chaines / nombres (avec strlen) et envoyer l'un ou l'autre dans la liste à renvoyer.

Et le résultat c'est que pour renvoyer des nombres ça marche sans problème, mais pour des chaines, c'est... disons une fois sur 2 roll

Par exemple je teste en renvoyant la liste des dossiers de la ti (main & unios). La liste renvoyée c'est {"main",59934}.

Alors la je comprends plus rien. Encore ça n'aurait pas marché du tout, ok, mais pourquoi ça marche une fois sur 2 ???
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

2

Un pointeur ne tient pas dans un unsigned int. Il faut au moins un unsigned long pour faire tenir un pointeur. Et pourquoi if(!strlen(type))? C'est n'importe quoi! Il faudra que tu codes le type quelque part, la calculatrice ne pourra pas deviner s'il s'agit d'un pointeur ou d'un nombre.
[edit]Edité par Kevin Kofler le 26-01-2002 à 16:23:52[/edit]
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

!strlen(type) ?

Heu je sais plus qui m'avait indiqué ça, mais ça marche (enfin d'après les tests que j'ai fait). Je v essayer l'unsigned long.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

4

union {void *ptr;unsigned long xnum;struct {unsigned char zero;unsigned char type;unsigned short num;};} retour[99];

void exe_addl(unsigned short valeur)
{
retour[rng_return++].xnum=valeur;
}

void exe_adds(char *string) // Pour ajouter une chaine dans la liste à renvoyer
{
retour[rng_return++].xnum=(unsigned long)string|0x40000UL;
}


...

push_quantum(END_TAG);
for(tmp=rng_return;tmp>0;tmp--)
{
if(retour[tmp-1].type) push_ANSI_string(retour[tmp-1].ptr);
else push_longint(retour[tmp-1].num);
}
push_quantum(LIST_TAG);


C'est la seule manière fiable de travailler. (Ça marque le type: type>=4 si c'est une chaîne de caractères, type==0 si c'est un nombre. Et ça marche sans problèmes parce que l'adresse 0x40000 est la même que l'adresse 0 etc.)
[edit]Edité par Kevin Kofler le 26-01-2002 à 16:42:38[/edit]
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é

5

Ouhhhh ! Encore une fois gt loin de la solution sad
Donc cette fois mon erreur c'était que j'entrais un pointeur dans la liste quand il s'agissait d'une chaine... C'est pas possible de rentrer la chaine directement dans la liste ? (avec strcpy, ou autre chose ?)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

6

Théoriquement oui, mais il faut allouer une matrice énorme pour retour. Avec un tableau de pointeurs (comme ici), c'est plus pratique. Seule chose à laquelle faire attention: si tes chaînes sont dynamiquement allouées, ne les libère pas trop tôt (pas avant la boucle de push_ANSI_string), mais n'oublie pas de les libérer avant de quitter.
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

Avec un tableau de pointeurs (comme ici), c'est plus pratique.
> Oui, j'imagine que ta solution est meilleure, mais c'est tjrs un peu frustrant de se faire refaire entièrement son programme wink Je vais essayer en allouant une grosse liste retour, par curiosité. En tout cas merci !

Théoriquement oui, mais il faut allouer une matrice énorme pour retour.
> C'est donc en utilisant strcpy ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

8

Bon bah ça marche pas facilement mon truc...
"protected error memory violation"

Je sais pas ce que j'ai encore raté, je vais utiliser ton algo c + sûr wink
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

9

Marche pas non plus sad
Ça attends longtemps, et puis y'a une erreur memory tsss
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)