nessuno (Normal User)
Guru^2
Messaggi: 6382
Iscritto: 03/01/2010
|
Hai pensato, per il problema originale della union, a scrivere la struct così
typedef struct
{
uint8_t giorno;
uint8_t mese;
uint16_t anno;
}data_struct;
?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/2010
|
Postato originariamente da nessuno:
Hai pensato, per il problema originale della union, a scrivere la struct così
typedef struct
{
uint8_t giorno;
uint8_t mese;
uint16_t anno;
}data_struct;
? |
???
AldoBaldo, in un post, ha detto di aver invertito i membri delle struct.
Perché complicarsi la vita con le union? Non sono state create per questo scopo.
In ogni modo, esiste la struct tm, o time_t già pronto.
( Ovviamente con la libreria < crono > ) Ultima modifica effettuata da Poggi Marco il 21/01/2018 alle 9:57 |
|
AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
Sì, nessuno, ci avevo pensato e anche provato, infatti in quel modo funziona. Però, vista l'origine del problema, direi che si tratta di un aggiramento, non di una soluzione. Per questo ho tentato un'altra strada abbandonando l'idea della union. Peccato, perché mi era sembrata una gran genialata!
Marco, il sistema del <time.h> usa una struttura molto più "ingombrante" perché ci immagazzina la data e l'ora, conteggiandole in secondi. Inoltre, come ti ho detto, per i sistemi a 32 bit siamo prossimi alla data di scadenza imposta dalla quantità di secondi massima rappresentabile. Altro inoltre oltre all'inoltre originale, non puoi spingerti più indietro del 1970. Mi verrebbe da inoltrarmi oltre nella catena degli inoltre, ma sembra già la fiera dell'Est!
Adesso che ci penso, avendo usato uint16_t per l'anno, anche la mia struct impone un limite minimo (anno 0) e un limite massimo (anno 65535). Forse avrei fatto meglio a usare un int16_t, per poter andare dall'anno -32768 all'anno 32765. Oh, intendiamoci, sono solo speculazioni fini a se stesse, tanto per ...passare il tempo!
P.S. Questa sera mi sento spiritoso. S'è notato?
Ultima modifica effettuata da AldoBaldo il 21/01/2018 alle 0:57
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti. |
|
tuttodiMC (Normal User)
Expert
Messaggi: 327
Iscritto: 29/10/2012
|
Vista la complessità non troppo elevata del problema, non si potrebbe semplicemente riscrivere una funzione di sort che ordini per vettori paralleli? Oppure, non si potrebbe dichiarare e riempire un array di pair di tipo <char*, int> e ordinare quello? Correggetemi se mi sbaglio.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6382
Iscritto: 03/01/2010
|
In realtà la union non complica le cose, anzi.
Quello che viene fatto in
((uint32_t)anno)<<16)|(((uint32_t)mese)<<8)|((uint32_t)giorno
la union la fa in maniera "nativa" (tenuto presente il corretto ordine dei campi nella struttura).
Quindi, la utilizzerei senza problemi.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
Non so se scrivo una stupidata, però "a naso" temo che neppure la versione con gli shift si possa considerare "sicura" rispetto alla questione delle endianness... sbaglio?
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6382
Iscritto: 03/01/2010
|
Se sai su quale architettura stai operando, puoi scrivere codice ragionevolmente corretto.
Ovviamente, se vuoi scrivere del codice "universale", devi usare delle #if per valutare il tipo di CPU e operare di conseguenza.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
lumo (Member)
Expert
Messaggi: 449
Iscritto: 18/04/2010
|
Sebbene la discussione abbia toccato temi "interessanti", direi che siamo andati un po' off-topic rispetto al problema originale dell'ordinamento.
Nel caso ci fosse ancora interesse a discutere di union e endianess, invito ad aprire un nuovo topic.
|
|