Unde este greseala?
Urmatoarea bucata de cod primeste in variabila “days” numarul de zile scurse de la ziua de nastere a lui Zoso si pana in prezent.
Dupa executia codului, variabila “years” trebuie sa contina anul curent, iar “days” – numarul de zile de la inceputul anului.
Codul are o mica eroare. Stiti care? (se pare ca echipa Zune n-a stiut pana de curand)
year = ORIGINYEAR; /* = 1980 */
while (days > 365)
{
if (IsLeapYear(year))
{
if (days > 366)
{
days -= 366;
year += 1;
}
}
else
{
days -= 365;
year += 1;
}
}
Labels: Microsoft


Pentru a nu va strica placerea de a gandi, comentariile sunt moderate (mai exact, voi intarzia putin publicarea comentariilor care contin raspunsul corect :-)
Posted by
Eduard |
January 03, 2009 12:25 AM
Dupa executia codului, variabila "days" va contine numarul de zile scurse de la ziua de nastere a lui zoso din anul curent, si nu numarul de zile scurse de la inceputul anului
Posted by
VladB |
January 03, 2009 2:07 AM
if (days >= 366)
Posted by
vali |
January 03, 2009 2:23 AM
in loc de
if (days > 366)
ar trebui sa fie
if (days >= 366)
pentru ca in cazul in care mai sunt exact 366 de zile, intra intr-un ciclu infinit, din cauza ca nu se mai scad zilele la nici o iteratie urmatoare.
Posted by
tudor |
January 03, 2009 2:43 AM
După else trebuia să mai fie un if(days > 365)
Posted by
scribu |
January 03, 2009 3:06 AM
sa zicem ca e anu 2008 ziua 366 din an
year = ORIGINYEAR; /* = 1980 */
while (days > 365) // days==366
{
if (IsLeapYear(year)) //year==2008
{
if (days > 366) //days== 366
{
days -= 366;
year += 1;
}
}
else
{
days -= 365;
year += 1;
}
//acum days a ramas 366, deci avem o bucla infinita mai frumoasa ca dra Minogue
}
Posted by
Anonymous |
January 03, 2009 3:16 AM
well, problema pare a fi faptul ca se intra intr-o bucla infinita din cauza ca ((days > 365) && IsLeapYear(year)) este true, insa nu acelasi lucru se poate spune si despre (days > 366).
Asa se explica si faptul ca player-ele isi revin dupa o zi, cand, odata cu schimbarea datei, se iasa din iteratia "buclucasa" :)
Posted by
seba18 |
January 03, 2009 3:31 AM
Daca Zoso s-a nascut in Leap Year, algoritmul nu functioneaza corect. Trebuie sa tina cont daca Zoso s-a nascut inainte sau dupa 29 februarie si in functie de asta sa scada 366 sau 365 de zile. De asemenea trebuie sa tina cont daca momentul prezent se afla in Leap Year dupa sau inainte de 29 feb.
Posted by
mihneasimian |
January 03, 2009 5:38 AM
pentru 31 decembrie 2008(un exemplu) codu' asta spune ca esti in ziua 0 din anul 2008. La fel pentru orice an bisect.
Posted by
guiman |
January 03, 2009 6:13 AM
Eroarea constă în achiziţionarea Microsoft Zune.
Posted by
Anonymous |
January 03, 2009 8:26 AM
Când isLeapYear == true && days == 366 -> infinite loop. :-) Cute.
Posted by
Vivi |
January 03, 2009 8:42 AM
"years" din descriere e year in cod :).
erorile cred ca sunt la comparatii, trebuie sa fie >= 365 si >= 366.
Posted by
alin |
January 03, 2009 10:31 AM
He-he, misto daca ultimul an e bisect si ai mai ramas cu 366 zile... cicleaza la infinit.
De ce or mai fi testat si "if (days > 366)" nu stiu.
Posted by
Alin |
January 03, 2009 3:40 PM
while (
days >
(IsLeapYear(year) ? 366 : 365)
)
...
e probabil un fix minimal pentru buba -- dar tot arata ciudat bucla aia.
Posted by
bogdan |
January 03, 2009 7:54 PM
Daca raman 366 zile si e leap year codul o cam ia pe aratura.
Pretty funny!
Posted by
sleepy |
January 03, 2009 8:19 PM
Mai da-mi un indiciu. Ce efecte produce greseala? Ca eu daca initializez days cu ceil (elapsed / 3600 / 24), unde elapsed este numarul de secunde, codul functioneaza bine, cel putin in aparenta.
http://www.ovidiugabriel.net/2009/01/1-ianuarie.html#comments
Posted by
ovidiugabriel |
January 04, 2009 12:11 AM
Vaaaaaai cit de adevarat! Oricum, am auzit ca Microsoft o sa produca un computer atit de rapid incit o sa termine ciclurile infinite in 366 de zile :)))
Posted by
patric |
January 04, 2009 5:00 AM
O sa-ti spun, desi nu o sa ma crezi, pentru ca e prea tarziu, deja mi-ai dat un indiciu.
Luand-o logic, banuiam eu ca e o greseala in legatura cu acel if ($days > 366), l-am comentat, dar nu am avut inspiratia sa incerc pe 31 dec 2008, am tot incercat alte date si parea in regula, asa ca am scos comentariile si m-am decis sa cer un indiciu suplimentar :D
Acum inteleg de ce echipa Zune n-a stiut pana de curand.
Posted by
ovidiugabriel |
January 04, 2009 5:07 AM
De fapt..asta e problema de programare de clasa a 7-a. O bucla infinita ..o data la 4 ani.
while ($days > 366) era corect :P
Posted by
ovidiugabriel |
January 04, 2009 6:50 AM
destul de simplu ..
pe ramura IsLeapYear se testeaza daca au trecut 367 de zile, adica un an si o zi, adica timp de o zi, nici contorul year nu se mareste, nici zilele nu se scad. endless loop.
Posted by
daimon |
January 04, 2009 9:01 AM
Cand day ajunge 366 si este intradevar leap year primul while este adevarat si se executa. Al doilea insa este fals iar executia este trimisa inapoi la primul, day fiind tot 366.
Programul va sari din while in while o zi intreaga.
Conditia if (days > 366) este in plus.
Posted by
Transsive |
January 04, 2009 9:18 AM
Felicitari, majoritatea ati prins ideea. Voi mai reveni cu probleme de genul asta, vad ca va plac :-)
@Alin (cu A mare): banuiesc ca testul "days > 366" e petru toti anii in afara de ultimul
@mihneasimian: ai fost pe-aproape, insa nu chiar. Problema apare pe 31 decembrie in anii bisecti (vezi si celelalte comentarii)
@guiman: de fapt e chiar mai rau, pentru ca testul e intr-un while, codul va cicla la infinit.
Posted by
Eduard |
January 04, 2009 1:01 PM
Eduard: S-a aflat cine din echipa Zune e parintele acestui minunat cod?
Oricum Solutia Microsoft e f faina. (Nu ca ar fi optiuni)
http://www.zune.net/en-us/support/zune30.htm
zune 30 faq
My Zune 30 is frozen. What should I do?
Follow these steps:
1. Disconnect your Zune from USB and AC power sources.
2. Because the player is frozen, its battery will drain—this is good. Wait until the battery is empty and the screen goes black. If the battery was fully charged, this might take a couple of hours.
3. Wait until after noon GMT on January 1, 2009 (that's 7 a.m. Eastern or 4 a.m. Pacific time).
4. Connect your Zune to either a USB port on the back or your computer or to AC power using the Zune AC Adapter and let it charge.
Once the battery has sufficient power, the player should start normally. No other action is required—you can go back to using your Zune!
Posted by
sleepy |
January 04, 2009 1:08 PM
@Sleepy: se pare ca minunea de mai sus e dintr-un device driver care n-a fost scris la noi, ci a fost furnizata cu driverul.
Posted by
Eduard |
January 04, 2009 1:19 PM
@Eduard: OK ... Am priceput acum.. deci asta e din codul folosit de Driverul pt ceas care nu poate fi schimbat de user (DRM issue).
http://pastie.org/349916
Makes sense ... dar orice tool de validat code iti da un warning la asta ... Inca nu pot sa cred!!!
Mai vreau topicuri din astea Eduard
Posted by
sleepy |
January 04, 2009 1:47 PM