Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Scomporre una data in pių stringhe
Forum - C/C++ - Scomporre una data in pių stringhe - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 19:41
Lunedė, 08/06/2015
Condivido un metodo alternativo comodo. Si puo` usare la sscanf nel seguente modo:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.  
  8.         char str[] = "{31/12/1999}";
  9.         int  giorno, mese, anno;
  10.  
  11.         sscanf(str, "%*c%d%*c%d%*c%d%*c", &giorno, &mese, &anno);
  12.         printf("%d %d %d\n", giorno, mese, anno);
  13.  
  14.         sscanf(str, "{%d/%d/%d}", &giorno, &mese, &anno);
  15.         printf("%d %d %d\n", giorno, mese, anno);
  16.  
  17.         return 0;
  18. }



Nota bene: tutte e due le sscanf fanno la stessa cosa solo che la prima e` piu` generica perche` funziona anche se la data di input e` del tipo {31-12-1999}  grazie al fatto che con %*c salto la lettura di un carattere.


Poi vorrei condividere anche una finezza, forse inutile, ma di certo non fa male:

Codice sorgente - presumibilmente C/C++

  1. int val_data = giorno + 128*mese + 16384*anno;



Invece di moltiplicare per 100 e 10000 coviene utilizzare potenze di 2 al loro posto. In questo caso si puo` usare 2^7 e 2^14 perche` sono i numeri maggiori e piu` vicini di 100 e 10000 rispettivamente.

Come mai questo? Perche` i compilatori sono intelligenti e vedono che moltiplichi per una potenza di due e invece di usare la istruzione MUL usano l'istruzione SHL che e` molto piu` rapida.

Ti faccio capire il perche` con un semplice esempio:

000000011 in binario = 3 in decimale
000000110 in binario = 6 in decimale
000001100 in binario = 12 in decimale
ecc..

se noti sto semplicemente spostando a sinistra i miei 11 (SHL), e questa operazione viene eseguita molto piu` velocemente che una moltiplicazione (MUL).

Ho controllato anche con gcc ed effetivamente lo fa:

Codice sorgente - presumibilmente C/C++

  1. ...
  2. 0x00000000004006bf <+178>:   shl    eax,0x7
  3. 0x00000000004006c2 <+181>:   mov    edx,eax
  4. 0x00000000004006c4 <+183>:   mov    eax,DWORD PTR [rbp-0x40]
  5. 0x00000000004006c7 <+186>:   add    edx,eax
  6. 0x00000000004006c9 <+188>:   mov    eax,DWORD PTR [rbp-0x38]
  7. 0x00000000004006cc <+191>:   shl    eax,0xe
  8. ...



Spero possa tornare utile :k:

Ultima modifica effettuata da XBarboX il 08/06/2015 alle 19:43
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 20:20
Lunedė, 08/06/2015
Questa č una chicca per pochi! Altro che finezza! Chissā perchč la sscanf non mi č venuta in mente prima........

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo