Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Gestion d'arguments variables

4 réponses
Avatar
sphinx.moro
Bonjour,
Je souhaite utiliser un script (fichier texte) qui a l'allure suivante:

NNNNN X=3Dval

ou NNNNNN est une valeur numerique
X une lette
S alors val est une chaine : S=3DTOTO
I alors val est un entier : I=3D33
F alors val est un flottant : F=3D4.6

Comment faire un programme qui lise ceci et fasse un appel a
un programme decalr=E9 comme
void errm_ConsoleOut(int i_ss, int Nerr, ...)

NB: Il y a un nombre inconnu de param=E8tres. L'ordre, les types, les
valeurs sont variables

Exemple:

1023 S=3Dtoto I=3D33 F=3D12.3 =3D> errm_ConsoleOut(1, "toto", 33, 12.4);

J'ai d=E9j=E0 un code mais qui ne fonctionne pas vraiment.
(Je teste sous LINUX en gcc 3.2 )

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
#include <stdlib.h> /* C RunTime Header Files */
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
char line[512];
char FMT[256];
typedef struct _arg {
char code;
union {
char * str;
int vali;
float valf;
};
} arg_t;
#define C_MAX_ARGS 16
arg_t ARGS[C_MAX_ARGS];
void errm_ConsoleOut(int i_ss, int Nerr, ...) {
va_list pa; /* variable argument list*/
va_start(pa, Nerr);
sprintf(FMT, "SS=3D%d, Er=3D%d ", i_ss, Nerr);
strcat(FMT, "A1=3D%s, A2=3D%s ");
vsprintf(line, FMT, pa);
va_end(pa);
printf("%s\n", line);
fflush(stdout);
}
/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D*/
void errm_Pause(char *s) {
printf("%s?> ", s);
fflush(stdout);
getchar();
}
/**
****************************************************************************
* \brief : Decode a line with variables arguments
* : and call the processing of Error
* % NNNNNNN [X=3DDATA]+

****************************************************************************
*/
int errm_ManageLine(int i_ss, char * LineIn) {
int NumError;
char code;
int v;
int size;
int nargs;
int Cr;
void * parguments;
void * parguments_start;
char * px;
char * py;
int p;
printf("start...%s\n", LineIn);
/* decode a complete line ine the form
*/
/* NNNNNNN [X=3DDATA]+
*/
px =3D strtok(LineIn, " \t\r\n");
/* Get the error number
*/
NumError=3Datoi(px);;
printf("Error=3D%X, i_ss=3D%X\n", NumError, i_ss);
p =3D 0;
size=3D0;
while (px !=3D NULL) {
px =3D strtok(NULL, " \t\r\n");
if(px !=3D NULL) {
code=3D*px;
px++;
px++;
/* Get the string for the argument
*/
switch(code){
case 'S' :
py =3D malloc(strlen(px)+1);
ARGS[p].str =3D py;;
strcpy(ARGS[p].str, px);
ARGS[p].code =3D 'S';
printf("P(%d)=3D%p\n", p, ARGS[p].str);
size +=3D sizeof(char *);
break;
case 'I' :
/* value
*/
v =3D atoi(px);
ARGS[p].code =3D 'I';
ARGS[p].vali =3D v;
size +=3D sizeof(int);
break;
}
p++;
}
}
nargs=3Dp;
printf("nbr arguments=3D%d, size=3D%d\n", nargs, size);
/* Alloc the arguments on the stack exactly
*/
parguments =3D (void*) alloca(size);
printf("parguments=3D%p\n", parguments);

for (p=3D0; p < nargs;p++){
/* Get the code for the argument
*/
switch(ARGS[p].code){
case 'S' :
*(((char**)parguments)++) =3D ARGS[p].str;
break;
case 'I' :
/* value
*/
*(((int*)parguments)++) =3D ARGS[p].vali;
break;
default:
printf("Error\n");
}
}
errm_ConsoleOut(i_ss, NumError);
/* free memory
*/
for (p=3D0; p < nargs;p++){
/* Get the string for the argument
*/
switch(ARGS[p].code){
case 'S' :
free(ARGS[p].str);
break;
default:
printf("Error\n");
}
}
return Cr;
}
/*-------------------------------------------------------------------------=
--------------*/
int main(int argc, char* argv[])
{
int Cr;
char line[128];
strcpy(line, "1000 S=3DP1 S=3DP2 ");
Cr=3D errm_ManageLine(256, line);
return 0;
}
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3DJ'ai
essay=E9 avec "asm", mais il semble que le fait d'avoir des arguments
variables
rajoute une frame dans la pile.
La visualisation du code d=E9assembl=E9 ne pas donn=E9 de solutions
imm=E9diate!!!


Quelqu'un a t il r=E9alis=E9 des choses similiaires?
Merci

4 réponses

Avatar
Antoine Leca
En news:,
sphinx.moro va escriure:
Je souhaite utiliser un script (fichier texte) [...]
Comment faire un programme qui lise ceci et fasse un appel a
un programme decalré comme
void errm_ConsoleOut(int i_ss, int Nerr, ...)


Autrement dit, un programme qui lis un fichier texte et produit un source C.


Exemple:
1023 S=toto I3 F.3 => errm_ConsoleOut(1, "toto", 33, 12.4);


Désolé, mais cela ne colle pas avec ton énoncé ci-dessus : "toto" n'est pas
un argument valide pour Nerr, et je ne vois pas où 1023 est utilisé.
Par ailleurs, je me demande comment la fonction errm_ConsoleOut() va
*deviner* qu'elle reçoit 4 argument cette fois-ci... mais bon, ce n'est pas
mon problème, hein.

Sinon, une variation autour de (non testé)

printf("errm_ConsoleOut(1");
while(++i<argc&&1[*++argv]=='=')
switch(**argv) {
case 'S': printf(", 2+"%s"",*argv); break;
case 'I':

case 'F': printf(", %s-0",2+*argv); break;
default: goto boum; }
puts(");");

agrémentée de la gestion pertinente des cas d'erreurs, devrait faire
l'affaire.


Comme c'est en fait de la gestion de chaînes de caractères, C n'est
peut-être pas le langage de programmation le plus adapté pour faire cela.
Mais bon, on peut le faire, bien sûr.


Antoine

Avatar
sphinx.moro
Merci,
Mais je pense que tu n'a pas saisi le
problème
Avatar
Antoine Leca
En news:,
sphinx.moro va escriure:
Merci,


De rien. Absolument de rien.

Mais je pense que tu n'a pas saisi le problème


Mmmh... Qui sait ?

Ce qui est sûr, c'est qu'avec les informations disponibles jusqu'à présent,
tu n'as pas de raison de changer d'avis.


Antoine

Avatar
Emmanuel Delahaye
Mais je pense que tu n'a pas saisi le
problème


Peut être a-t-il été mal ou insuffisamment exposé... Je dis ça, je dis
rien...

--
A+

Emmanuel Delahaye