nieuws: Interne klok 30GB-model Zune struikelt over schrikkeljaar
Ik weet dat het laat is, maar nu de broncode van dat onderdeel beschikbaar is, blijkt dat de fout niet veroorzaakt wordt omdat er geen rekening wordt gehouden met een schrikkeljaar, maar omdat hij gewoon in een infinite loop vast geraakt.
ORIGINYEAR is 1980, dit stukje moet berekenen welk jaar het op dit moment is (aantal dagen sinds 1980 wordt bijgehouden, daar wordt telkens 365 of 366 afgetrokken). Als we aan de laatste dag van een schrikkeljaar komen, dan wordt de loop nog eenmaal uitgevoerd (meer dan 365 dagen), maar omdat het er niet meer dan 366 zijn en geen else { break; } wordt voorzien, blijft de code eeuwig hangen in de lus.
Er wordt dus wel degelijk rekening gehouden met schrikkeljaren.
Volledige broncode, moest iemand geïnteresseerd zijn.
Ik weet dat het laat is, maar nu de broncode van dat onderdeel beschikbaar is, blijkt dat de fout niet veroorzaakt wordt omdat er geen rekening wordt gehouden met een schrikkeljaar, maar omdat hij gewoon in een infinite loop vast geraakt.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| year = ORIGINYEAR;
while (days > 365)
{
if (IsLeapYear(year))
{
if (days > 366)
{
days -= 366;
year += 1;
}
}
else
{
days -= 365;
year += 1;
}
} |
ORIGINYEAR is 1980, dit stukje moet berekenen welk jaar het op dit moment is (aantal dagen sinds 1980 wordt bijgehouden, daar wordt telkens 365 of 366 afgetrokken). Als we aan de laatste dag van een schrikkeljaar komen, dan wordt de loop nog eenmaal uitgevoerd (meer dan 365 dagen), maar omdat het er niet meer dan 366 zijn en geen else { break; } wordt voorzien, blijft de code eeuwig hangen in de lus.
Er wordt dus wel degelijk rekening gehouden met schrikkeljaren.
Volledige broncode, moest iemand geïnteresseerd zijn.