voila le problème:
Je travaille sur un programme qui devra tourner sur des vieilles machines (style des vieux sgi/ibm/sun).
J'ai découvert la fonction asprintf à la suite de recherche pare rapport à ce dont j'ai besoin,
Pour info, cette fonction fait comme sprintf, sauf qu'en plus, elle gere l'allocation memoire pour le buffer où sera stocker le resultat.Bref, c'est du bonheur.
seulement, elle n'est pas standart.Je dois donc mettre son source dans mon code.Seulement, mes compétence sont prise en defaut.
/*
alias de la fonction GNU etendue asprintf (non standart)
Cette fonction formatte une sortie dans un buffer, qui est alloué dynamiquement.
Penser à 'free' le buffer quand on a finis de l'utiliser.
*/
int nabprintf(char *str,const char *format, ...)
{
int str_size=1024;
int mem_size;
va_list ap,aq;
char *buffer;
/*initialisation argument 'variadique'*/
va_copy (aq ,ap);
va_end(ap);
if((buffer=(char *)malloc(str_size*sizeof(char)))==NULL)
{
fprintf(stderr,"L'alocation de memoire a echouer (%d octets demandé)\n",str_size);
}
mem_size=str_size;
while(str_size <0 || str_size>=mem_size)
{
va_copy (aq ,ap);
va_end(ap);
va_start (aq ,format);
str_size=snprintf(buffer,mem_size,format,aq); /*le problème est ici*/
printf("verification:\n");
printf("format:%s\n",format);
printf("buffer:%s\n",buffer);
va_end(aq);
if(str_size <0)
{
fprintf(stderr,"Une erreur s'est produite durant l'execution de snprintf\n");
return FALSE;
}
if(str_size>=mem_size)
{
char *ptr;
fprintf(stderr,"le resultat de snprintf est trop grand, realocation de memoire %d->%d\n",mem_size,str_size);
if((ptr=(char *)realloc(buffer,str_size*sizeof(char)))==NULL)
{
fprintf(stderr,"L'alocation de memoire a echouer (%d octets demandé),neanmoins, le pointeur reste neanmoins intact\n",str_size);
return FALSE;
}
else
{
buffer=ptr;
}
}
}
return TRUE;
}
/*!
\param conn La connexion monté sur la BDD
\param clef_adapt Buffer de char contenant la clef de l'adaptateur local à effacer.ne doit pas être NULL.
\return TRUE si pas d'erreur, FALSE sinon.
*/
int SuppAdaptLocal(PGconn *conn,char *clef_adapt)
{
char *requete;/*on utilise une variable car la requete n'est pas statique*/
int str_size=-1;
int mem_size=1024;
PGresult *res;
if(clef_adapt==NULL)
{
fprintf(stderr,"erreur:le pointeur clef_adapt est NULL.\n");
return FALSE;
}
nabprintf(requete,"DELETE FROM adaptateurs_locaux WHERE clef=%s",clef_adapt);
res = PQexec(conn,requete);
free(requete);
return TRUE;
}
Ce que je veux faire:
recuperer un nombre d'argument variable, et le forwarder tel quel sur une fonction de type printf.
------------------------------------ | numero | nom_adapt | clef | ------------------------------------ | 0 | chouette | 1321652 | ------------------------------------ | 1 | steak hache | 986325 | ------------------------------------ | 2 | machin chose | 6325 | ------------------------------------ | 3 | bidule | 164325 | ------------------------------------ Choisissez un adaptateur local (de 0 a 3) : 2 verification: format: DELETE FROM adaptateurs_locaux WHERE clef=%s buffer: DELETE FROM adaptateurs_locaux WHERE clef=Ððÿ¿Ððÿ¿▒õÿ¿¯š clef adaptateur distant effacée:6325
je voudrais arriver à un truc du style
buffer: DELETE FROM adaptateurs_locaux WHERE clef=6325
je pense que je suis pas tres loin de la verité, il ne manque pas grand chose , seulement, c'est hard, et pas courant dans les tutoriaux
