Fermer2
andoh_wilfriedLe 09/09/2004 à 09:43
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 ?