cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 18 nov. 2009 à 14:33
Bienvenue,
Déjà, une remarque générale : tu as des fonctions qui sont supposées renvoyer des entiers qui ne le font pas ou uniquement dans certains cas.
Deuxième remarque, tu disposes d'une balise "code" sur ce forum (Troisième icône en partant de la gauche en haut de la zone où taper le texte), qui te permet de poster du code sans perdre l'indentation.
Troisième remarque, tu as un souci avec nb_num. Dans ton test :
while (i < nb_num)
nb_num est une variable locale et n'a pas été initialisée. Il faudrait plutôt que tu passes cette variable en argument.
Quatrième : quelle taille font les longs avec ton compilo/OS ?
Voilà un code gcc/windows qui permet de passer du 32 au 64 bits facilement.
#include <windows.h>
#include <stdio.h>
#include <stdarg.h>
/* Commenter la ligne suivante pour passer en 32 bits */
#define USE_64
#ifdef USE_64
#define ARG_TYPE long long
#else
#define ARG_TYPE int
#endif
void my_putnbr(ARG_TYPE nb)
{
#ifdef USE_64
char lpBuffer[1024];
/* Sur un autre OS ou avec d'autres compilateur, essayer printf("%lld", nb) */
wsprintf(lpBuffer, "%I64d", nb);
puts(lpBuffer);
#else
printf("%d\n", nb);
#endif
}
void sous_func(va_list ap,int nb_num)
{
int i;
ARG_TYPE nb;
for (i = 0; i < nb_num; i++)
{
nb = va_arg(ap, ARG_TYPE);
my_putnbr(nb);
}
}
void my_printf_num(int nb_num, ...)
{
va_list ap;
va_start(ap, nb_num);
sous_func(ap, nb_num);
va_end(ap);
}
int main()
{
#ifdef USE_64
my_printf_num(2, (ARG_TYPE)6000111222LL, (ARG_TYPE)1);
#else
my_printf_num(2, (ARG_TYPE)2000111222, (ARG_TYPE)1);
#endif
return 0;
}