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 ?