• [^] # Re: Petite précision pour Benoit

    Posté par (site web personnel) . En réponse au message tableau comme argument à vsprintf. Évalué à 2.

    Effectivement, j'ai modifié la fonction dans le commentaire pour quelle gere un NULL de fin plutot qu'un arguments donnant le nombre de resultats. Enfin tout le monde aura corrigé mais bon:
     } while (nom_col);
     } while (nom_col);
     va_end (ap);
    
    La solution que ta donné Médinoc fonctionne sous linux/x86 elle aussi
    #include <stdarg.h>
    #include <stdlib.h>
    #ifdef __cplusplus
    #define _ADDRESSOF(v) ( &reinterpret_cast<const char &>(v) )
    #else
    #define _ADDRESSOF(v) ( &(v) )
    #endif
    #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
    #define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
    #ifdef va_start
    #undef va_start
    #endif
    #define va_start _crt_va_start
    int main() {
     char * param[8];
     param[0] = NULL;
     param[1] = "Blabla";
     param[2] = "Test";
     param[3] = NULL;
     va_list vl;
     va_start(vl, param[0]);
    #if 1
     vprintf("%s => %s %d",vl);
    #else
     char const *str;
     while((str = va_arg(vl, char const*)) != NULL)
     puts(str);
    #endif
     va_end(vl);
    }
    
    Mais je te déconseille fortement cette methode parce que ce n'est absolument pas portable. Contrairement à ce que semble penser cet "Expert confirmé Senior" les valist sont dépendantes de la plateforme matérielle et non de la plateforme logicielle. Typiquement ce code fonctionne sur x86 mais à peu de chance de fonctionner sur powerpc par exemple ou plus betement sur Itanium ou en mode x86-64. Mon conseil: Utilise des appels a snprintf dans une boucle ou autre structure de controle ce sera bcp plus propre. Exemple en reprenant ton code, transforme:
    
    if( bon1 ){ strcat( fromat," col1='%s',"); param[i++]=param1;}
    
    En:
    
    
    if( bon1 ){ i += snprintf( buf + i, buf_s, "col1='%s',", param1); buf_s -=i;}