1

Bonjour,

Comme promis, je me suis lancé dans le C, et comme tout débutant, je bloque sur les pointeurs.

Je voudrais accéder au .tag_str de :
typedef struct {   unsigned char tag_order;   unsigned char tag_version;   unsigned char min_max_args; /* 4 MSB for minimal number of arguments, 4 LSB for maximal number of arguments */   unsigned char proc_args;   void (*CALLBACK tag_proc) (void); /* routine that handles the tag */   unsigned long tag_str; /* Pointer to string data on AMS 1.xx, string ID suitable for XR_stringPtr on later AMS versions */  } tag_info; 


J'ai donc codé cela :
    push_END_TAG ();     push_parse_text ("y+1/((x-3)(x^2+4))");      tag_info primary_tag_list; \je créé ma liste de tag, basée sur le top_estack ?     printf(primary_tag_list.tag_str); \ c'est un pointeur, je devrais mettre un * quelque part ?

Festival des * et des &, mais globalement, c'est "makes pointer from integer without a cast".

Un peu perdu. Pourriez-vous m'aider ?

2

tag_info primary_tag_list; \je créé ma liste de tag, basée sur le top_estack ?
Ca, c'est pour créer une instance de la structure tag_info, mais ce n'est certainement pas du tout ce que tu veux wink
A mon avis, tu ne veux probablement pas non plus accéder au tableau fourni par AMS qui décrit certaines infos pour les "Tags" d'estack.h.
Donc, que veux-tu faire avec ce qui est à top_estack ? L'imprimer sous une forme ou une autre ?

printf(primary_tag_list.tag_str); \ c'est un pointeur, je devrais mettre un * quelque part ?
printf prend une chaîne de formattage.
Ici, ça serait printf("%s",<...>->tag_str);
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

3

Regarde la doc de ton compilateur C, chercher "printf", t'auras tout ce qu'il faut pour formater ton texte.

4

Lionel Debroux (./2) :
A mon avis, tu ne veux probablement pas non plus accéder au tableau fourni par AMS qui décrit certaines infos pour les "Tags" d'estack.h.
Donc, que veux-tu faire avec ce qui est à top_estack ? L'imprimer sous une forme ou une autre ?


Ce que je voudrais, c'est récupérer la liste des tags qui sont dans une expression.

"x+2", que j'ai placé dans le top_estack, et comme dans tag_info, il y avait .tag_str, je me suis dis que je pourrais jeter un coup d'oeil.

Je voudrais bien fouiller dans tout ces tags, mais je ne se suis même pas fichu d'afficher cela. Donc je cherche, j'essaie ce que vous me dites et je persévère. Merci.

5

Ce que je voudrais, c'est récupérer la liste des tags qui sont dans une expression.

Dans ton cas, ça sera tout ce qu'il y a entre top_estack et le END_TAG que tu as poussé avant le push_parse_text, depuis les adresses hautes vers les adresses basses.
primary_tag_list, secondary_tag_list et command_tag_list peuvent éventuellement t'aider à afficher ces tags - mais à ce moment-là, mieux vaut utiliser Parse1DExpr() ou Parse2DExpr()+Print2DExpr(), qui font déjà ce travail.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

6

Mais :
Parse1DExpr does a similar job as display_statements (i.e. converts a RPN expression to the TEXT and returns the handle to the text)
,


Donc si je comprends bien, il convertit {3,x,+} en "3+x".

Ce que je veux c'est faire l'inverse !

Mais tu m'as fais comprendre que si je pousse "3+x" dans la pile avec push_parse_text, j'obtiens dans la pile :

END_TAG
x
3
+


C'est bien ça ?

Alors il suffit (si top_estack est bien un pointeur) que je remonte la pile avec --top_estack, j'affiche et je m'arrête à END_TAG. C'est ça ? Et elle fait quelle taille cette pile ?

Merci pour les réponses, j'essaie ça demain après midei. Je viens de corriger 30 copies de 3e, il faut d'urgence aller se coucher.

7

cidrolin (./6) :
Et elle fait quelle taille cette pile ?

Ca, tu n'as pas à le savoir 1. parce que c'est très dur à déterminer 2. parce que tu n'en as pas besoin

Tu peux parcourir les éléments de tag en tag, jusqu'à ce que tu atteignes le END_TAG. Regardes next_expression_index (je crois).
Et la taille que tu parcourras entre chaque élément, tu ne la connais pas, c'est next_expression_index qui fera le saut qu'il faut pour passer d'une donnée à une autre.
Tu n'en as donc pas besoin dans un premier temps, pour remonter jusqu'à ton END_TAG

ça devrait donner un truc genre
while( next_expression_index( ptr ) != end_tag);

(n'essayes pas ça directement, je connais pas le C, ma syntaxe n'est sûrement pas bonne).

8

En fait, je voulais dire, quelle taille elle peut faire avant que la calculatrice n'explose.


Ok, ça devrait aller. Surtout que comme d'hab, RTFM :
Algebraic form: integrate (e^(x^2), x, 1, 2)
RPN form: 2 1 x 2 x ^ e ^ integrate
Sequence of bytes: [02 01 1F] [01 01 1F] [08] [02 01 1F] [08] [93] [25] [93] [C4]



faut que j'extraie la séquence de bits, et que je l'affiche en 'français'.
Je vous tiens au courant.


9

cidrolin (./8) :
En fait, je voulais dire, quelle taille elle peut faire avant que la calculatrice n'explose

Tu peux y aller, ça fait plusieurs kilos (24 je crois).

Euh sinon... tu te lances dans quoi là, j'ai peur o_O

10

cidrolin (./8) :
En fait, je voulais dire, quelle taille elle peut faire avant que la calculatrice n'explose.
Mon esprit mal tourné se le demande aussi.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

11

Folco (./9) :
Tu peux y aller, ça fait plusieurs kilos (24 je crois).
Mon Dieu...
Euh sinon... tu te lances dans quoi là, j'ai peur o_O
Oui je sais pas si c'est prévu pour cheeky
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

12

T'es en forme ce soir triso

13

Pardon grin Reprenez.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

14

Lis le commentaire dans la structure, tu ne peux pas afficher le tag_str directement dans AMS >= 2.00! Il faut appeler d'abord XR_stringPtr sur le nombre.
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é

15

Folco (./9) :

Euh sinon... tu te lances dans quoi là, j'ai peur o_O


Bah, dans la programmation open-source sur TI HW1 qui me rendra riche et célèbre. smile smile

16

Je parlais de l'algorithme grin

(sinon, célèbre en ne visant que les HW1, ça va être sportif grin)

17

Folco (./7) :
Regardes next_expression_index


Folco (./9) :
Tu peux y aller, ça fait plusieurs kilos (24 je crois).


C'était juste pour ma culture...
Kevin Kofler (./14) :
Il faut appeler d'abord XR_stringPtr sur le nombre


Merci. Pour l'instant je me perds un peu dans les pointeurs, je vais voire cela quand je serai un peu moins mauvais.

Folco (./7) :
Regardes next_expression_index


Ca ressemble tout à fait à ce dont j'ai besoin, mais dès que je fais :

ESI expr = top_estack;
expr = next_expression_index(expr);

J'ai une erreur à l'exécution. Peut-être parce que top_estack est de type CESI et expr de type ESI... donc je n'aurais pas le droit de le modifier ?


Donc j'ai bricolé avec les pointeurs pour remonter la pile :

printf_xy (0, 10 +10*i, "Ox%lp, %x", expr-i, *(expr-i));


dans un while() me donne une liste de bits : Le tag 1 est vu comme [02] [01] [1F] au lieu de [02 01 1F]. Comment avoir la taille du rang n de la pile ?

Parce que même sur top_estack, je ne connais pas la longueur à garder? Peut-être avec le next_expression_index... mais ça marche pô.
So, top_estack points to the last byte of the first argument.


OK. Mais quelle taille fait cette argument ? et comment j'extrais un plusieurs bits avec un pointeur ? *top_estack[0:size], mais on n'est pas en Matlab.

18

Mon petit doigt me dit que ça, ça va bien m'aider :
delete_begin = next_expression_index (delete_begin); delete_begin--;

dans la doc toujours !