1

Voilà j'essaie de faire un petit prog qui concatène une liste d'arguments NUM ou STR en intercalant si possible du texte comme séparateur :
l'appel donnerai un truc du genre : ' mkarg("InitText" , "insText" , ArgLIST )

par exemple pour utiliser Flib plus rapidement avec des listes
mkarg( "Flib_Fonction:" , "," , ArgLIST)


voici le code mais je n'arrive pas à récupere la liste et à la traité au fur et à mésure .
Suis-je obligé de récupérer tout les arguments d'abord ?

(un instant j'edite le code) // C Source File // Created 22/08/04; 15:00:45 // Delete or comment out the items you do not need. #define RETURN_VALUE #define MIN_AMS 101 #include <tigcclib.h> #include <args.h> #include <estack.h> #include <stdio.h> #include <string.h> #define SIZE 1001 // Main Function void _main(void) {      // Place your code here.      char mkstr[SIZE];      char *ins,*txt,*elt;      short i=0,argtype,num;      long l,n;      ESI argptr=top_estack;      clrscr();   while ((argtype = GetArgType (argptr)) != END_TAG)      { // Recup du texte d'initialisation "InitText"           i++;           if(i==1 && argtype==STR_TAG)           {                strcpy(txt,GetStrnArg(argptr));                n=strlen(txt);                strncpy(mkstr,txt,n);                printf("InitStr : %s Len %li\n",txt,n);                ngetchx();           }           else if(i==2 && argtype==STR_TAG)           { // Recup du texte d'insertion "insText"                strcpy(ins,GetStrnArg(argptr));                l=strlen(ins);                printf("InsStr : %s Len %li\n",ins,l);                ngetchx();           }           else if(i==3 && argtype==LIST_TAG)           { // Recup des éléments de la liste "ArgLIST" et ajout successif à la chaine de retour             while((argtype=GetArgType (argptr)) != END_TAG)             {                     if(argtype==POSINT_TAG || argtype==NEGINT_TAG )                     {                          num=GetIntArg(argptr);                          if(argtype == NEGINT_TAG)                               num=-num;                          sprintf(elt,"%i",num);                     }                     else if(argtype==STR_TAG)                     {                          strcpy(elt,GetStrnArg(argptr));                     }                     else                          {                               num=GetIntArg(argptr);                               printf("TAG char: %c TAG code %li\n",num,num);                               ngetchx();                               push_zstr("argument error!");                               return;                           }                     printf("%s",elt);                     ngetchx();                  if(kbhit() && ngetchx()==KEY_ESC)                           {push_zstr("exit"); return; }                     if(n+=(strlen(elt)+l)<1000)                     {                       strcat(mkstr,elt);                       strcat(mkstr,ins); // faut que je calcule la taille de la liste pour ne pas inserer en dernier                     }                     else                          {push_zstr("too long !"); return; }             }           }           else                {push_zstr("No LIST found !"); return; }      }      push_zstr(mkstr);      return; }

En fait le problème c'est que après avoir reconnu le LIST_TAG por commencer la récupération de la Liste je me trouve avec un autre TAG qui n'est ni un POSINT_TAG
ni NEGINT_TAG ni STR_TAG.
A quoi celà est-il du ?
Ce n'est certainement pas printf qui à laissé quelque chose sur la pile

Vu que je ne vois pas d'ou cela peut provenir ; je voudrais passer en l'argument suivant en virant celui qui me gène.
Quelle instruction doit utiliser ?


j'avais cru comprendre que GetArgType (argptr) modifiait le pointeur pour passer au suivant. Je suppose que les arguments sont juste sauté .
Comment faire pour les supprimer de la pile ?


Alors pourquoi est ce que j'obtiens une boucle infini si je sort pas prog ?


2

y a personne pour m'aider !!!!

3

./2> deux heures de temps, c'est peu... pas de réponse en deux heures, ça n'a rien d'étonnant...
surtout qu'à cette heure là, pas mal de gens en vacances dorment, et les autres sont en cours
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

4

else if(i==3 && argtype==LIST_TAG)
          {
            while((argtype=GetArgType (argptr)) != END_TAG)
            {
                    if(argtype==POSINT_TAG || argtype==NEGINT_TAG )
                    {

Tu fais un premier GetArtType, tu trouves LIST_TAG, puis ensuite t'en fais un autre immédiatement après et tu t'attends à trouver autre chose qu'un LIST_TAG ? En dessous du "if(i==3 && argtype==LIST_TAG)" faut décaler ton pointeur pour qu'il soit sur le premier element de ta liste, et attention c'est un décalage en arrière.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

Vertyos-> Heureusement que tu es là! je doutais de trouver quelqu'un qui veuille répondre à mes questions. Merci!


c'est quoi ce truc : je ne pige plus rien

En insérant

else if(i==3 && argtype==LIST_TAG)
while((argtype=GetArgType (argptr)) == LIST_TAG)
;

c'est juste pour passer à l'argument suivant , pourquoi dois-je attendre ; un simple

argtype=GetArgType (argptr))

ne suffit pas à passer à l'argument suivant ?

ou est-ce pour trouver un second LIST_TAG confus je pige plus rien là !

tu me dit que je dois décaler le pointeur en arrière (je suppose que le décallage de GetArgType (arptr) équivaut à argptr-- donc je doit faire argptr++

Mais si je ne suis pas à la fin de la liste pourquoi dois-je revenir en arrière pour récuperer les arguments comme suit :

argptr++;
getIntArg(argptr) ou GetStrnArg(argptr) pour recuperer les éléments du dernier au 1er


Donc la fin de la List c'est quand je retombe sur le LIST_TAG et non END_TAG


C'est pas pour t'emmerder Vertyos mais je veux bien comprendre une fois pour toute.

GetArgType(argptr) ne décrémente-t-il pas le pointeur comme dans argptr-- ??

6

Pfffff... Lis la doc de TIGCC, apprends un peu comment ça fonctionne parceque tu mélanges tout là... On va faire en image, c'est encore ce qui risque d'être le plus simple :

[ ..., END_TAG, END_TAG, 50, 1, POSINT_TAG, 0, 'P', 'l', 'o', 'p', 0, STR_TAG, LIST_TAG, 0, 'b', 0, STR_TAG, 0, 'a', 0, STR_TAG ]

Voilà la pile, j'ai placé les différents blocs en couleur pour les différencier plus facilement. Actuellement, top_estack indique l'emplacement du dernier STR_TAG : le sommet de la pile. Puisqu'on lit ça en sens inverse, la pile contient donc : "a", "b", {"Plop", 50}.

Tu commences ton programme, GetArgType, ça renvoie STR_TAG. Tu récupere la première chaine, "a", et le pointeur se place sur l'argument suivant : le deuxième STR_TAG. Tu récuperes la deuxième chaine, "b", et le pointeur se place sur l'argument suivant : le LIST_TAG.

A partir de là, ton truc merde completement. Il faut tout simplement décaler le pointeur avec argPtr--, ce qui le fait passer sur le STR_TAG. Là tu continues comme avant, avec des GetArgType et des GetIntArg / GetStrnArg, ce qui va lire tous les elements de la liste jusqu'au END_TAG final. Tu sais donc que tu es arrivé à la fin de la liste, tu décrementes le pointeur pour passer sur l'argument suivant : le END_TAG, qui indique la fin des arguments.

Maintenant débrouille toi avec ça, je ne répondrais plus à ces questions tant que tu n'auras pas lu la doc serieusement.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

7

M'enfin pour conclure disons que voici ce que je doit écrire pour récupérer la liste :

else if(i==3 && argtype==LIST_TAG)
{
// Recup des éléments de la liste "ArgLIST" et ajout successif à la chaine de retour
argptr--;// se placer après LIST_TAG
while((argtype=GetArgType (argptr)) != END_TAG)
{
}
// fin de parcours de la list , passer au l'argument suivant s'il en a sinon à la fin de la procédure
argptr--;


8

merci Vertyos pour ton aide c'est limpide à présent.
j'avais preque bon à çeci près :

argptr--;


En fait GetArgType lit juste la valeur pointé par argptr et ne modifie par le pointeur.
Ce ne sont que GetIntArg et GetStrnAgr qui modifient le pointeur argptr

lorsqu'on croise un TAG qui indique un argument multiple il faut faire argprt-- pour se positionner sur le premier argument et commencer à lire et un autre argptr-- lorqu'on trouve le END_TAG pour passer à l'argument suivant


Merci pour l'info !

9

annulé

10

annulé

11

OK ça y est ça marche, Enfin Vertyos !


- une optimisation possible pour gagner 50 octets à tout casser en remplaçant strcpy(*dest,*src) par stradd(*dest,*src,*long pos) ; je ferai ça plus tard.

Mais il a un truc qui m'a fait chier :
j'utilise char mkstr[SIZE],elt[61],sep[61]; au lieu de char mkstr[SIZE],*elt,*sep;parceque avec strcat j'ai quelques problèmes. Je l'ai donc remplacé par 'stradd' qui fait aussi 'strcpy'.

stradd(*dest,*src,*long pos) copy 'src' à la position 'pos' dans 'dest';

Ce que j'ai compris de strcat(*dest,*scr) c'est que dest doit être plus grand que strlen(dest) +

strlen(src) pour contenir le résultat de la concaténation.


Dans le source :

-les instructions qui provoque les bug sont en commentaires et commencent par 'ou'. Voici les 2

bugs (pas de crash)
-> pas de copie de 'sep' avec strcat
-> la variable de concaténation 'mkstr' se comporte +- comme une var globale : sa

longueur n'est pas initialisé lors de la copie du texte d'initialisation avec

strcpy(mkstr,GetStrnArg(arpgptr))


Je ne comprends pas ces bugs ????????????????
// C Source File // Created 22/08/04; 15:00:45 // Delete or comment out the items you do not need. #define RETURN_VALUE #define MIN_AMS 101 #include <tigcclib.h> #include <args.h> #include <estack.h> #include <stdio.h> #include <string.h> #define SIZE 1001 void stradd(char * dest,char *src,long pos) {      long i=0;      while((*(dest+pos++)=*(src+i++))!='\0')           ; } // Main Function void _main(void) {      char mkstr[SIZE],elt[61],sep[61];      short i=0,argtype;      long l=0,n=0,m=0,num;      ESI argptr=top_estack;      //clrscr();   while ((argtype = GetArgType (argptr)) != END_TAG)      { // Recup du texte d'initialisation "InitText"           i++;           if(i==1 && argtype==STR_TAG)           {                strcpy(mkstr,GetStrnArg(argptr));                n=strlen(mkstr);                //stradd(mkstr,elt,0,n);           }           else if(i==2 && argtype==STR_TAG)           { // Recup du texte d'insertion "insText"                strcpy(sep,GetStrnArg(argptr));                l=strlen(sep);           }           else if(i==3 && argtype==LIST_TAG)           { // Recup des éléments de la liste "ArgLIST" et ajout successif à la chaine de retour                argptr--;                  while((argtype=GetArgType (argptr)) != END_TAG)                  {                     if(argtype==POSINT_TAG || argtype==NEGINT_TAG ||  argtype==STR_TAG)                     {                          if(argtype==STR_TAG)                          {                               strncpy(elt,GetStrnArg(argptr),60);                          }                          else                          {                               num=GetIntArg(argptr);                               if(argtype == NEGINT_TAG)                                    num=-num;                               sprintf(elt,"%li",num);                          }                          m=strlen(elt);                          if(n+m+l<1000)                          {                            stradd(mkstr,elt,n);                            stradd(mkstr,sep,n+m);                            n+=m+l;                          }                          else                               {push_zstr("too long !"); return; }                     }                     else                      {                          {push_zstr("Arglis Error !"); return; }                     }                  if(kbhit() && ngetchx()==KEY_ESC)                           {push_zstr("exit"); return; }                  }                argprt--; // fin de lecture de la liste : au suivant            }      }      else      {push_zstr("No Str or LIST found !"); return; }      }      *(mkstr+n-l)='\0';      push_zstr(mkstr);      return; }

12

D'après la doc :
GetStrnArg is a macro which returns the current string argument (pointed to by ap) and modifies ap to point to the next argument in the argument list.

onc pas besoin de faire argptr--;tu n'as dà la fin de ta boucle while (celle des listes)

aussi, tu n'a pas l'air d'initialiser les chaines de caractere elt et sep avant de les utiliser. Ca peut amener des pb, par exemple, si par hasard, il n'y avait pas de '\0' ds l'espace memoire alloué de tes chaines.

13

ok pour ça !

Une autre question maintenant que le prog fonctionne.

la fonction mkarg("InitText" , "insText" , ArgLIST ) renvoie un string en concaténant
"InitText" , "insText", et tous les éléments de la liste.

Lorsque je l'imbrique dans une autre fonction : surprise ça marche un peu trop à mon goût.
En effet en plus du résultat attendu cela ramène aussi les arguments de la fonction c'est allucinant.
en claire
si f est non defini sur la ti ;
f( mkarg( "drawstr:" , "," , { "Will" , 0 , 10 , 1 } ) donne comme résultat
f( "drawstr:Will,0,10, 1" , "drawstr:" , "," , { "Will" , 0 , 10 , 1 } )

Je croyais que les fonctions GetIntArg/GetStrnArg purgeait la pile des arguments qui sont récupérés !!!!!!!!

Dans ce cas que dois-je faire changer le top_estack ?
je deviens fou moi !

14

Si tu as ce problème, c'est parce ce que tu ne nettoies pas la ESTACK avant de 'push' la valeur qui sera retournée par ta fonction.
La solution ce trouve dans dans l'aide de TIGCC "HOW TO MAKE A PROGRAM RETURNING VALUE". info

Tu dois utiliser le code ci-dessous juste avant d'insérer, dans la ESTACK, la valeur à retourner:

while (GetArgType (top_estack) != END_TAG)
top_estack = next_expression_index (top_estack);
top_estack--;


Exemple:

#define RETURN_VALUE
#include <tigcclib.h>
short ti92p;

// Retourne la somme de deux nbres passés en argument
void _main(void)
{
int nb1, nb2;
ESI ptr = top_estack;

nb1 = GetIntArg (ptr);
nb2 = GetIntArg (ptr);

while (GetArgType (top_estack) != END_TAG)
top_estack = next_expression_index (top_estack);
top_estack--;

push_shortint(nb1 + nb2);
}

Je croyais que les fonctions GetIntArg/GetStrnArg purgeait la pile des arguments qui sont récupérés !!!!!!!!

top_estack doit être réinitialisé et on ne doit laisser qu'une seule valeur dans la pile.


15

Ou après, avec delete_between (cf. la version gérant le calcul formel de cet exemple).
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é

16

il n'a pas de fonction MoveArg insert_before ou move_before pour inserer,deplacer des éléments dans la pile ?
je n'ai trouver que 'move_between_to_top'
et push_between pour copier quelque part mais il n'est pas indiqué où ?

donc faut que fasse ça à la main pour push_between_before ??????????????

je suis obliger de copier les arguments de la pile dans un tableau pour les réorganiser ensuite juste pour changer l'ordre des arguments, ou remplacer un argument après l'avoir traité. c'est couteux les doublons dans un tableau alors que les arguments sont déjà dans la pile, même si ce n'est que temporaire !


justement a propos de delete_between :

je veux concatener des listes et laisser tous les éléments sur la pile pour qu'une autre fonction les prennent en argument.
Je procède en virant de la pile tous TAG (LIST_TAG , END_TAG ) délimitant chaque liste et je m'arrête au END_TAG de la fonction appelante. j'utilise delete_between pour virer les TAG mais j'ai un internal_error comprend pas si delete_between modifie les pointeurs ou est-ce que je n'est pas le droit de passer argptr-1 en argument

else if(argtype==LIST_TAG)
{

k=h=0; //compteur de LIST_TAG et END_TAG

if(mode==2)
{

while(k-h>=0) // un LIST_TAG doit être avant le END_TAG
{

{ ST_showHelp((sprintf(sep,"{=%i }=%i",k,h),sep)); ngetchx(); }
(argtype==LIST_TAG?k++:h++);

if(k-h>=0)
{

delete_between(argptr-1,argptr); // suppression du TAG
argptr--;
{ ST_showHelp("Find Next Tag"); ngetchx(); }

while((argtype=GetArgType (argptr)) != LIST_TAG || argtype != END_TAG) //BUG je crois
SkipArg(argptr);
}

}

break; // fin du netoyage des TAG

}

else

17

Allo ! mur
quelqu'un veut m'aider !!
push_between ça copie où vu que y a push_between_to_top

18

delete_between fait ce qui dit son nom, il "efface entre". Donc tout est décalé.
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é

19

oui , mais ça ne fait rien aux 2 pointeurs je suppose du moins au premier à la rigeur le second c'est normal qu'il le décale.

mon problème c'est l'insertion

push_between ça copie où vu que y a push_between_to_top ?????????????????

20

[EDIT: Je n'ai rien dit. grin]
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é

21

Oui mais Kevin dans la DOC de TIGCC c'est pas indiqué la destination de la copie de l'estack entre les 2 pointeurs push_between(void *ptr1 , void *ptr2 ).

Il faudra m'expliquer à quoi ça sert cette fonction

22

Tout d'abord :
J’ai la version la + récente de tigcc ide et dans la doc je n'ai pas vu la fonction push_between_to_top mais + tôt les fonctions push_between et move_between_to_top.

Ensuite:
push_between
Pour cette fonction je pense que déjà le 'push' utilisé comme préfixe nous suggère clairement le fait que c'est dans la ESTACK que les octets considérés sont mis. Quant à l'endroit précis au sein cette pile, je dirais que cela dépend de Top_Estack.

En clair, en lisant la doc de TIGCC, j'en arrive à penser que la fonction push_between permet de copier les octets (d'un endroit quelconque de mémoire) compris entre ptr1+1 et ptr2 (si on considère que l'on exécute push_between(ptr1, ptr2) ) dans la ESTACK; à partir de l'endroit pointé par top_estack qui n'est, je précise, pas forcement le sommet de la pile (ESTACK). A moins que push_between ne réinitialise top_estack avant de faire la copie; mais cela n'a pas été mentionné dans la doc. Donc je suppose que...

Quoi qu'il en soit au vu de la déclaration:
Void push_between (void *ptr1, void *ptr2)
On est sûr que son rôle est de copier une serie d'octets d'un endroit quelconque vers la ESTASK.
Je vais bien la tester et te faire mon CR.

move_between_to_top
Quant à cette 2ème fonction elle est beaucoup + simple à comprendre elle effectue simplement un déplacement de +ieurs octets contenus dans la ESTACK vers le sommet de cette pile

Pour ta fonction push_between_to_top soit elle n'existe pas, soit j'ai vraiment sous estimé l'état de somnolence dans lequel je suis depuis une bonne heure. zzz
Bon! ça suffit je vais, de ce pas, me coucher!!!

Au fait j'ai jeté un coup d'oeil sur ton code.
Il était très sérieusement atteint, mais j'ai réussi à corriger toutes les erreurs qui s'y trouvaient. Néanmoins, ne crions par victoire trop tôt puisqu'il reste encore une flopé de WARNINGS (~100 ya de quoi devenir fou ) du type: "Passing arg x of pointer to function from incompatible pointer type" à corriger.
Le genre de warnings qui créent facilement des ERREURS DE PROTECTION MEMOIRE.
Ce n'est pas pour t'alarmer; mais ça ne va pas être du cake ...


23

Jackrac :
push_between
Pour cette fonction je pense que déjà le 'push' utilisé comme préfixe nous suggère clairement le fait que c'est dans la ESTACK que les octets considérés sont mis. Quant à l'endroit précis au sein cette pile, je dirais que cela dépend de Top_Estack.
En clair, en lisant la doc de TIGCC, j'en arrive à penser que la fonction push_between permet de copier les octets (d'un endroit quelconque de mémoire) compris entre ptr1+1 et ptr2 (si on considère que l'on exécute push_between(ptr1, ptr2) ) dans la ESTACK; [ ... ]

La doc dit clairement : push_between pushes a sequence of bytes starting at ptr1+1 and ending at ptr2 to the expression stack..
Pourquoi tu "penses que", tu "en arrive à penser que"... C'est marqué noir sur blanc, qu'est-ce qu'il te faut de plus ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

24

Jackrac
: Pour cette fonction je pense que déjà le 'push' utilisé comme préfixe nous suggère clairement le fait que c'est dans la ESTACK que les octets considérés sont mis.

Oui.
Quant à l'endroit précis au sein cette pile, je dirais que cela dépend de Top_Estack.

Oui.
En clair, en lisant la doc de TIGCC, j'en arrive à penser que la fonction push_between permet de copier les octets (d'un endroit quelconque de mémoire) compris entre ptr1+1 et ptr2 (si on considère que l'on exécute push_between(ptr1, ptr2) ) dans la ESTACK; à partir de l'endroit pointé par top_estack

Oui.
qui n'est, je précise, pas forcement le sommet de la pile (ESTACK).

Si. Si tu mets autre chose dans top_estack, ton programme est bogué. Toutes les fonctions push_* et delete_* mettent à jour top_estack pour que ça pointe toujours sur le sommet de la pile. move_between_to_top se sert aussi de top_estack.
Pour ta fonction push_between_to_top soit elle n'existe pas, soit j'ai vraiment sous estimé l'état de somnolence dans lequel je suis depuis une bonne heure. zzz

Ben, ce que tu veux, c'est push_between!
"Passing arg x of pointer to function from incompatible pointer type"

Il faudrait voir de quoi il s'agit pour savoir si c'est vraiment un problème.
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é

25

Merci Kevin mais j'espère que tu as remarqué que je répondais aux deux messages de andoh_wilfried; smile je cite:
andoh_wilfried:
oui , mais ça ne fait rien aux 2 pointeurs je suppose du moins au premier à la rigeur le second c'est normal qu'il le décale.

mon problème c'est l'insertion

push_between ça copie où vu que y a push_between_to_top ?????????????????


andoh_wilfried:
Oui mais Kevin dans la DOC de TIGCC c'est pas indiqué la destination de la copie de l'estack entre les 2 pointeurs push_between(void *ptr1 , void *ptr2 ).
Il faudra m'expliquer à quoi ça sert cette fonction



En ce qui te concerne, Vertyos, mon "j'en arrive à penser que" (aussi étrange soit t-il) est l'expression d'un doute qui subsiste seulement dans la deuxième partie (en rouge) de ma phrase.
En clair, en lisant la doc de TIGCC, j'en arrive à penser que la fonction push_between permet de copier les octets (d'un endroit quelconque de mémoire) compris entre ptr1+1 et ptr2 (si on considère que l'on exécute push_between(ptr1, ptr2) ) dans la ESTACK; à partir de l'endroit pointé par top_estack qui n'est, je précise, pas forcement le sommet de la pile (ESTACK).

Cela se ressent bien dans la phrase suivante:
A moins que push_between ne réinitialise top_estack avant de faire la copie; mais cela n'a pas été mentionné dans la doc. Donc je suppose que...

Mais je te le concède; vu comme ça, la constitution de ce paragraphe parait un peu étrange. Mettons ça sur le compte du sommeil! smile

Merci à vous deux. wink

26

bien j'étais absent depuis 2 jours , mais je vous signale que j'ai résolu tous mes problème sur l'estack;
En effet en relisant tout estack.h je me suis rendu compte que "dans l'estack" = "top_estack"
dommage de n'avoir pas pu poster plus tôt.
En fait mkarg sert à manipuler les arguments d'une fonction pour soit :
- créer une liste à partir de tous les arguments
- créer un string par concaténation en convertissant les entiers au besoin
- transformer ne liste en argument pour une autre fonction (vont être content les basic-programmeurs de sauver tous leur arguments dans une liste)
le truc c'est que je ne veux récupérer le mois possible d'argument en le faisant directement sur la pile.

Donc je déplace le top_estack temporairement pour écrire à l'endroit où je veux et ensuite je le restore.
mais je fait gaffe au fonction qui le modifie.

pour Augmenter liste et matrice ; je cours à travers la pile pour virer les LIST_TAG et END_TAG de chaque liste et après j'ai plus qu'à en mettre un au debut et un autre à la fin. comme ça je m'en tape du type d'argument passé à la fonction.



27

Trafiquer top_estack de cette manière est un hack très sale et va forcément foirer avec des fonctions de style delete_between. Ne le fais pas.
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é

28

oui mais je suis désolé K.K. ; je n'ai pas d'autre moyen de déplacer un éléement de la pile à un autre endroit à par au top_estack.
Alors je veux pouvoir inserer des éléments dans la pile ailleur qu'au top_estack sans avoir à tout sauvegarder et restorer juste après. J'ai pas envi de gaspiller de la mémoire juste pour remettre les éléments de la pile dans un autre ordre.

Va falloir que TIGCC implémente ça ? c'est pas trop normale que la pile ne gère pas les insertion

29

andoh_wilfried
: Alors je veux pouvoir inserer des éléments dans la pile ailleur qu'au top_estack

Tu ne peux pas.
La pile d'expressions est faite pour fonctionner comme une pile (surprise! grin), donc tu ne peux rajouter qu'à la fin.
Tes hacks ne fonctionneront pas. Ton "insertion" ne sera pas une insertion, tu vas écraser tout ce qu'il y avait à la suite de ton top_estack modifié! Mettre top_estack à l'adresse x veut dire effacer (logiquement) tout ce qui se trouve à des adresses >x, la prochaine écriture effacera ça physiquement!
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é

30

Oui ça j'avais compris c'est pour cela que là ou je dois écraser par la suite je met des TAG_unitile en nombre suffisant pour écrire dessus par la suite.
Mais si je veux faire un memcopy de l'estack entre 2 pointeurs je fait comment ?
parce que si on peut convertir les ESI en pointeur sur void * je supose alor je pourrait implémenter l'insertion ?
existe t-il une fonction pour transformer les ESI en pointeur ?