ziopippo:
Questa è la dichiarazione delle variabili:uint8_t tmpYear;Il motivo per cui ho dovuto fare quelle strane sottrazioni non me lo spiego neanche io, soprattutto quella relativa al 2018.
Ok, tutto chiaro, più o meno, c'è ancora un errore nascosto da qualche parte ma adesso è chiaro.
Partiamo dal principio.
La funzione 'year()' restituisce un valore a 16 bit compreso tra 1970 2069.
La cosa più semplice sarebbe quindi usare una 'tmpYear' da 16 bit (una banale variabile tipo int) per manipolare l'anno (regolandolo quindi con l'encoder dal 1970 al 2069), e poi sottrarre 1970 quando la si vuole copiare nella 'tm.Year', perché 'tm.Year' è un offset rispetto al valore 1970. Tutto questo in tabella 1, semplice, lineare, nessuna possibilità di errore:
TABELLA 1
-1970
Year() tmpYear tm.Year
------------------------------------
1970 1970 0
1971 1971 1
. . .
. . .
1998 1998 28
1999 1999 29
------------------------------------
2000 2000 30
2001 2001 31
2018 2018 48
. . .
. . .
2068 2068 98
2069 2069 99
MA...
Tu hai usato una 'tmpYear' a 8 bit che non può contenere un valore superiore a 255, quindi servono due operazioni invece di una. Prima sottraiamo 2000 al valore restituito da 'year()', in modo da lavorare in 'tmpYear' a 8 bit con un valore compreso tra 0 e 69 per gli anni 2000..2069, ma anche un valore negativo in complemento a due per gli anni dal 1970 al 1999.
E' un problema? No. Ci basta regolare l'anno in 'tmpYear' solo da 0 a 69 senza sconfinare nei valori negativi e tutto funziona. Quando dobbiamo aggiornare 'tm.Year' dobbiamo anche aggiungere 30 per riportare i valori come 'tm.Year' richiede. Il tutto in tabella 2, anche questo funziona senza errori:
TABELLA 2
-2000 +30
Year() tmpYear tm.Year
------------------------------------
1970 226 (-30) 0
1971 227 (-29) 1
. . .
. . .
1998 254 (-2) 28
1999 255 (-1) 29
------------------------------------
2000 0 30
2001 1 31
2018 18 48
. . .
. . .
2068 68 98
2069 69 99
MA...
Invece tu hai fatto così per tentativi (tabella 3):
TABELLA 3
-1999 -2018
Year() tmpYear tm.Year
-------------------------------------
1970 227 (-29) 1
1971 228 (-28) 2
. . .
. . .
1998 255 (-1) 29
1999 0 30
-------------------------------------
2000 1 31
2001 2 32
2018 19 49
. . .
2068 69 99
2069 70 100
Iniziamo con il lolloso 2018... sottrarre 2018 da una variabile 8 bit senza segno è del tutto equivalente a sommare 30, in pratica se scrivevi +30 era la stessa cosa (il fatto che siamo nel 2018 è una pura coincidenza
)
Di differente dalla tabella 2 rimane solo quel 1999... che sfalsa di uno i valori degli anni, per cui va sicuramente a "compensare" un errore (probabilmente un decremento) presente da qualche altra parte.
Risolto quell'errore si può quindi tranquillamente usare l'attuale procedimento (ma sottraendo 2000 come in tabella 2) regolando 'tmpYear' da 0 a 69.
Il caso è chiuso ![]()