Stampare long long int

Buonasera a tutti

Mi trovo nella necessità di stampare su base regolare degli interi unsigned ad almeno 52 bit

Dato che arduino ha il tipo long long int sarei intenzionato ad usarlo
Ma non è stampabile, purtroppo

Tempo fa avevo fatto una cosa del genere, ma si trattava di una funzione separata che dovevo richiamare apposta

Adesso invece mi trovo a dover stampare ripetutamente tali numeri, anche assieme ad altri

Insomma mi servirebbe di sovraccaricare la print

Mi date due dritte?

In particolare Guglielmo, che conosce i segreti di Arduino come le sue tasche?

Adesso attacca Montalbano e non posso provare, ma che dite, pur essendo la print nel core, secondo voi posso sovraccaricare nel sorgente del punto-ino?

Purtroppo non ho fatto in tempo a provare nulla al termine del pomeriggio, da quando vivo a varese il tempo evapora come acqua nel deserto...

ciao,

prova a dare un occhio a QUESTA discussione

Grazie

Stanotte se l'insonnia non mi abbandona...

ho avuto quelche giorno di confusione, ma a qualcosa sono giunto

ho una nuova nodemcu e quindi ho dovuto modificare il core della esp8266

non mi è piaciuto prorpio proprio tanto, ma per adesso mi accontento

ho aggiunto questo a Print.cpp, e i suoi prototipi a Print.h

// Nelson 01/08/20


size_t Print::println(unsigned long long int num, uint8_t base)
{
   size_t n = print(num, base);
   n += println();
   return n;
}

size_t Print::println(long long int num, uint8_t base)
{
   size_t n = print(num, base);
   n += println();
   return n;
}



size_t Print::print(long long int num, uint8_t base)
{
   if(num < 0)
   {
      int t = print('-');
      num = -num;
      return print((unsigned long long int)num, base) + t;
   }

   else
   {
      return print((unsigned long long int)num, base);
   }
}


size_t Print::print(unsigned long long int n, uint8_t base)
{
   char buf[8 * sizeof(unsigned long long int) + 1]; // Assumes 8-bit chars plus zero byte.
   char *str = &buf[sizeof(buf) - 1];
   *str = '\0';

   // prevent crash if called with base == 1
   if(base < 2)
      base = 10;

   do
   {
      unsigned long long m = n;
      n /= base;
      char c = m - base * n;
      *--str = c < 10 ? c + '0' : c + 'A' - 10;
   }
   while(n);

   return write(str);
}

// Nelson

c’é qualcosa che non mi convince in questa soluzione, ma per adesso va bene così

ciao Salvorhardin,

tempo fa era servito anche a me fare la stampa di interi a 64 bit; non ricordo quanto avevo "tribolato" all'epoca per trovare la discussione ...questa volta sono andato a colpo sicuro :smiley: