Gestion des long int

kiira31 Messages postés 1 Date d'inscription lundi 16 novembre 2009 Statut Membre Dernière intervention 16 novembre 2009 - 16 nov. 2009 à 11:54
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 18 nov. 2009 à 14:33
Bonjour,

Je code en ce moment la fonction printf. Je suis en train de gerer l affichage d'un nombre mais
j'ai un souci pour gerer les long.

Voici mon code:

#include <stdarg.h>

int sous_func(va_list ap)
{
int i;
int nb_num;
int nb;

i = 0;
nb = 0;
while (i < nb_num)
{
nb = va_arg(ap, int);
if (nb == 0)
return (0);
my_putnbr(nb);
i++;
}
}

int my_printf_num(int nb_num, ...)
{
va_list ap;

va_start(ap, nb_num);
sous_func(ap);
va_end(ap);
}

int main()
{
my_printf_num(1, 737892873, 0);
}

Pourriez vous m'expliquer comment gerer les long

1 réponse

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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;
} 
0
Rejoignez-nous