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
****************************************************************************
*/
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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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
En news:1144081628.908873.146520@z34g2000cwc.googlegroups.com,
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.
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.
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.
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
sphinx.moro
Merci, Mais je pense que tu n'a pas saisi le problème
Merci,
Mais je pense que tu n'a pas saisi le
problème