Autopsia al código fuente del Zune revela orden de suicidio

(c) Pastie.org

(c) Pastie.org

Para los más fanáticos o para aquellos que requieren de una explicación lógica ante un problema complejo, ya está disponible el código de programación que hizo que miles de reproductores Zune dejaran de funcionar colectivamente. El error comienza en la línea 249.

En circunstancias normales, esto funciona muy bien. La función sigue restando ya sea 365 o 366 hasta que se reduce a menos de un año para luego convertirse en el mes y el día de mes.

Lo que pasa es que en el caso del último día de un año bisiesto, continúa hasta que llega a 366. Debido al if (days>366) la ejecución para de sustraer si el bucle (loop) pasa a ser un año bisiesto. Pero 366 es demasiado grande para salir del bucle principal, lo que se traduce en que el Zune continue en el loop infinito sin hacer nada.

Si el error no se arregla, lo mismo va a suceder el 31 de diciembre del 2012… Microsoft, tienes 3 años… ¿alcanzarás?

Link: PQOAL Real-time clock (RTC) routines for the MC13783 PMIC RTC (Pastie.org)

Compartir Compartir
Publicado por Alexander Schek el 2 de January 2009 en la categoría Destacados, Software con los tags , , , , . Tiene 101 comentarios.

101 Comentarios

Autopsia al código fuente del Zune revela orden de suicidio

Deja tu Comentario ↓
x.org

DesaprobarAprobar29x.org dijo el 2-1-2009 a las 18:49:

1

Si no es mucha molestia, ¿Algún programador en el público nos puede explicar que pasa aquí?

eduardo dimare

DesaprobarAprobar3eduardo dimare dijo el 2-1-2009 a las 18:49:

2

lol!!!

Rhadamantis

DesaprobarAprobar2Rhadamantis dijo el 2-1-2009 a las 18:53:

3

jaja al ver esto me recordóa las clasesitas de PASCAL en el colgio xD

Gargadon

DesaprobarAprobar5Gargadon dijo el 2-1-2009 a las 18:54:

4

Completamente LOL, a ver si avisamos a los de Microsoft que el 2008 tuvo 366 días, y así cada cuatro años :D

LOL

DesaprobarAprobar6LOL dijo el 2-1-2009 a las 18:57:

5

@Rhadamantis

Es C#(sharp).

No entiendo que tiene de malo el booleano :P ,si mostraran todo el booleano se podrida deducir q esta malo.

Gon

DesaprobarAprobar62Gon dijo el 2-1-2009 a las 19:07:

6

@x.org: sucede que si consideras un año corriente de 365 días, el código es correcto. Pero en el otro caso, del año bisiesto, incurre en un loop infinito. El error fatal esta en el:

if (days > 366)

Que pregunta “si cantidad de días es mayor a 366″, o lo que es igual, si hay 367 o más días en este año, lo cual en ningún caso ocurre, por lo tanto el loop se vuelve infinito.
debería ser

if (days >= 366)

Lo chistoso fue la solución propuesta por MS de “cargar completamente el Zune, y luego cambiarle la fecha a 1 de enero de 2009 o mayor”. La pregunta es, ¿como diablos cambiarle la fecha si el susodicho aparata está bloqueado? Es como el “No se ha detectado teclado, presione enter para continuar”.

PS: Lo leí primero vía @fcatrin :B

lator1

DesaprobarAprobar-7lator1 dijo el 2-1-2009 a las 19:11:

7

quien usa Zune si asta la compañia que le hacia el MKT renuncio al water!!!

Perico

DesaprobarAprobar-11Perico dijo el 2-1-2009 a las 19:13:

8

no puede ser un codigo fuente tan flaite ni yo cuando estudie programacion hacia weas tan feas a puros IF JAJAJAJAAJAJAJAJa

Ver Comentario... Jorge dijo el 2-1-2009 a las 19:17 ...

Jorge

DesaprobarAprobar35Jorge dijo el 2-1-2009 a las 19:20:

10

ahhh ya la pille!!! si los dias son 366 nunca sale del loop

Gon: tienes razon, sorry por mi post apresurado

Zhekreb

DesaprobarAprobar3Zhekreb dijo el 2-1-2009 a las 19:22:

11

@LOL: seguramente, pero en un comentario inicial del codigo dice que el nombre del módulo (ese archivo) es rtc.c; lo que claramente implica que el código es C.

//——————————————————————————
//
// Module: rtc.c
//
// PQOAL Real-time clock (RTC) routines for the MC13783 PMIC RTC.
//
//——————————————————————————

Tu madre

DesaprobarAprobar0Tu madre dijo el 2-1-2009 a las 19:25:

12

Creo que el error ya esta solucionado, ya que solo ocurria en los Zune de 30 Gb.
Sera que estas personar nunca actualizaron su dispositivo.
En todo caso para que un Zune > Ipod, en muchisimos aspectos.

flaco

DesaprobarAprobar3flaco dijo el 2-1-2009 a las 19:26:

13

@LOL, no es C#, c# no tiene un atributo o clase BOOL

winjaime

DesaprobarAprobar4winjaime dijo el 2-1-2009 a las 19:28:

14

me pregunto cual será la solución “tipo microsoft” que habrá…Espero que no sea: “el 31 de diciembre de 2012 cambie la fecha a 1 de enero de 2013″ o algo asi

Gon

DesaprobarAprobar4Gon dijo el 2-1-2009 a las 19:28:

15

@flaco, no cuesta nada definir una constante TRUE O FALSE, en C.

Mr_Trukit0

DesaprobarAprobar2Mr_Trukit0 dijo el 2-1-2009 a las 19:32:

16

Jajajajaja el medio owned…

¿Y han lanzado alguna actualización de firmware?

Daniel

DesaprobarAprobar8Daniel dijo el 2-1-2009 a las 19:42:

17

Pasa hasta en las mejores familias…

oscar

DesaprobarAprobar-6oscar dijo el 2-1-2009 a las 19:52:

18

ajjajajaja, me recuerda la vez que sin querer maté el servidor anakena del DCC con una bomba fork :S

Kique

DesaprobarAprobar13Kique dijo el 2-1-2009 a las 19:53:

19

Cualquier parecido con el código fuente de cualquier otro producto de M$ es mera coincidencia...

mauro

DesaprobarAprobar0mauro dijo el 2-1-2009 a las 19:55:

20

Que chanta el error … la cago ..

Ver Comentario... Fray dijo el 2-1-2009 a las 20:03 ...

Algalord

DesaprobarAprobar4Algalord dijo el 2-1-2009 a las 20:04:

22

Seguramente habrá que descargarse la nueva versión del firmware, un parche que estimo estará disponible en unos tres años más.

Alfredo

DesaprobarAprobar0Alfredo dijo el 2-1-2009 a las 20:05:

23

Se ve que estuvieron apresurados para terminar con el Zune que tanto asi ni se diero cuenta del error (days>366) Esto es imposible ps!! jajaja

fuelforfire

DesaprobarAprobar5fuelforfire dijo el 2-1-2009 a las 20:11:

24

Por eso el software libre es tan popular, porque esa clase de errores estupidos de MS, se hubiesen arreglado en un par de dias, si se hubiese dado en una aplicacion opensource. Ademas, el arreglo se hubise hecho publico.

Saludos.

NecroX

DesaprobarAprobar26NecroX dijo el 2-1-2009 a las 20:21:

25

if (days = 367)
{
printf ("WTF?!");
}

alvaro

DesaprobarAprobar8alvaro dijo el 2-1-2009 a las 20:31:

26

Por un puro sigo “=” XD.

flaco

DesaprobarAprobar4flaco dijo el 2-1-2009 a las 20:33:

27

@Gon, obvio, pero para que vas a definir una constante true o false en c# si ya la tiene…
el punto, es que segun mi opinion, el lenguaje es C++

Tern

DesaprobarAprobar-6Tern dijo el 2-1-2009 a las 20:34:

28

No sé si sentirme orgulloso pq entiendo q es lo q dice el código o pegarme un tiro por pasar de sentirme Geek a Nerd……

NecroX

DesaprobarAprobar8NecroX dijo el 2-1-2009 a las 20:36:

29

if (days = 367)

{

printf(" WTF?!?! ");

}

Ver Comentario... JRRB dijo el 2-1-2009 a las 20:43 ...

Autopsia al código fuente del Zune revela orden de suicidio

DesaprobarAprobar0Autopsia al código fuente del Zune revela orden de suicidio dijo el 2-1-2009 a las 20:46:

31

[...] Autopsia al código fuente del Zune revela orden de suicidiowww.fayerwayer.com/2009/01/autopsia-al-codigo-fuente-de-zune… por Disacido hace pocos segundos [...]

luis

DesaprobarAprobar1luis dijo el 2-1-2009 a las 20:51:

32

@jrrb

2009 no es bisiesto, 2008 si lo fué

lolcito

DesaprobarAprobar1lolcito dijo el 2-1-2009 a las 20:51:

33

parece ke el aweonao ke escribio eso no hizo el ejercicio del if y el año bisiesto ke te enseñan en todos lados para explicar estructuras de control xD

NC

DesaprobarAprobar5NC dijo el 2-1-2009 a las 20:58:

34

Eso es puro y simple C.

Regalamos Ipod

DesaprobarAprobar-2Regalamos Ipod dijo el 2-1-2009 a las 21:02:

35

ajajajaja xD… muy simples simples con sus ifs :S

creo que tiene bien merecido que los boten xD..

microsoft tiene la culpa de contrarar a gnte asi :S y no buscar calidad antes de cantidad

farve

DesaprobarAprobar0farve dijo el 2-1-2009 a las 21:12:

36

son 4 años no 3!

Luis Vera

DesaprobarAprobar32Luis Vera dijo el 2-1-2009 a las 21:15:

37

q ironía…. Microsoft tiene un problema con Infinite Loop

freak!

DesaprobarAprobar0freak! dijo el 2-1-2009 a las 21:23:

38

vayance acostumbrando porque Microsoft no lo soluciona dentro de dies años…

Carlos

DesaprobarAprobar-1Carlos dijo el 2-1-2009 a las 21:25:

39

omg ese error lo comete uno en primer año no mas xD n000000000bz
bueno suele pasar.
Ojala microsoft pueda actualizar sus Zune para que el error sea solucionado

victor

DesaprobarAprobar7victor dijo el 2-1-2009 a las 21:54:

40

no es por causar molestias, ¿pero de donde salio ese pedazo de codigo fuente?, al que todos sabemos microsoft se niega a mostrar rotundamente :S

el_dva,

DesaprobarAprobar1el_dva, dijo el 2-1-2009 a las 21:56:

41

Exacto el error esta en la linea 263 deberia ser if (days>365), como no detectaron ese error con las pruebas unitarias!

Andres

DesaprobarAprobar1Andres dijo el 2-1-2009 a las 22:12:

42

Para un año bisiesto el día 366 es el 31 de diciembre, mientras que para un año normal sería el 01 de enero del siguiente año. El problema lo presenta el while (days > 365), porque para un año normal 366 sería el 01 de enero, pero como este año fue bisiesto el while deberia ser while (days > 366) para que este código funcione.

Al final cuando es el 31 de diciembre del 2008 osea days es 366 cumple la condición IsLeapYear(year) año bisiesto, pero no la condición if (days > 366) lo cual es correcto porque todavia no es el 01 de enero.

Para mi al final el error lo tiene la condición del loop while.

mrjavo

DesaprobarAprobar2mrjavo dijo el 2-1-2009 a las 22:23:

43

Debe ser puro y simple C… pq si no no veriamos semejante manejo tan arcaico de las fechas siendo q hoy en dia hay ya tipos DATE mas sencillos de manejar, java los tiene :D , C# y VB.Net tambien, pero me imagino q igual no es posible por ser una pieza de HW q tiene q manejar lenguajes lo mas cercanos al bajo nivel

Ricardo

DesaprobarAprobar0Ricardo dijo el 2-1-2009 a las 22:37:

44

Increíble que el problema sea un simple “=” y más que la gente de MS digan que se vuelva a prender el Zune y setear la fecha a 1 de enero de 2009. ¿Llegarán a corregir el error? Todos lo usuarios de Zune esperan eso.

Saludos!

reinaldo

DesaprobarAprobar1reinaldo dijo el 2-1-2009 a las 22:46:

45

concluyendo parece que un signo “=” fue el que falto.

desgraciadamente nada se, la verdad es que no entendi nada a los programadores que vistan FW, pero si el error es ese pequeño signo hay una razon mas para preferir software libre u open source (como quieran llamarle) a la semana un programador habria pillado el error, hecho la correccion y avisado a la gente para descargar una actualizacion.

por eso prefiero los mp4 de menos de 60 lucas, nunca me han dado problemas.

hashing

DesaprobarAprobar-3hashing dijo el 2-1-2009 a las 22:53:

46

Tendría que ver el resto del código, pero ese no es necesariamente el problema. Están PROFUNDAMENTE equivocados.

dpc

DesaprobarAprobar1dpc dijo el 2-1-2009 a las 23:47:

47

Basicamente que cuando el zune muestre la hora y la fecha un 31 de diciembre de un año bisiesto, tendra que ir a este procedimiento para calcularlo, y de aqui no saldra nunca, con lo cual dejara de responder.

dpc

DesaprobarAprobar2dpc dijo el 2-1-2009 a las 23:50:

48

hashing no digas bobadas, ese es el error, quieres ver el codigo completo?
aqui esta:

BOOL ConvertDays(UINT32 days, SYSTEMTIME* lpTime)
{
int dayofweek, month, year;
UINT8 *month_tab;

//Calculate current day of the week
dayofweek = GetDayOfWeek(days);

year = ORIGINYEAR;

while (days > 365)
{
if (IsLeapYear(year))
{
if (days > 366)
{
days -= 366;
year += 1;
}
}
else
{
days -= 365;
year += 1;
}
}

// Determine whether it is a leap year
month_tab = (UINT8 *)((IsLeapYear(year))? monthtable_leap : monthtable);

for (month=0; month<12; month++)
{
if (days wDay = days;
lpTime->wDayOfWeek = dayofweek;
lpTime->wMonth = month;
lpTime->wYear = year;

return TRUE;
}

de http://pastie.org/349916

Alphamania

DesaprobarAprobar2Alphamania dijo el 2-1-2009 a las 23:51:

49

K complicaa la computacion :S… x un error minimo queda LA – KA – GA

Guillermo

DesaprobarAprobar6Guillermo dijo el 2-1-2009 a las 23:54:

50

Habria k ver el resto del codigo, pero no es tan facil como agragar un signo =, ya k asi dejarian el contador de dias en el dia cero y estaria = de malo el codigo, fijence que para que entre en el while debe estar en el dia 366 y si el año no es bisiesto deja el contador de dias en 1 y le suma un año al contador d años, pero cndo es bisiesto la idea es que pase al dia 367 para restarle 366 y dejar el contador d dias en 1, pero como la funcion k cuenta los dias esta fuera del while no alcanza a aumentar a 367 y queda en un loop infinito.

No se si m explique bien y no creo =P pero hice lo que pude, solo k estan equivocados los que dicen que poniendole un = se arreglaria el error ya que no es tan simple como eso.

Gon

DesaprobarAprobar4Gon dijo el 3-1-2009 a las 00:01:

51

Bueh, la verdad es que no me he fijado completamente en todos los casos, pero igualmente me cabe otra duda. EXISTEN librerías para contar fechas y horas, entonces ¿porque reescribir esa porción de código?

Dicen que el mejor programador no es quien hace los mejores algoritmos, ni los que optimizan, ni los que podrían reprogramarlo todo desde cero. El mejor programador es el que sabe aprovechar y reutilizar lo que tiene a mano.

TurboMAC

DesaprobarAprobar-1TurboMAC dijo el 3-1-2009 a las 00:02:

52

En que esta programado Zune??? En C??? En visual???

hashing

DesaprobarAprobar0hashing dijo el 3-1-2009 a las 00:17:

53

@dpc,
ok, viendo el código completo (de hecho, las siguientes dos líneas) si, el error es evidente. Pero hasta el punto que se presenta en el artículo, es insuficiente. El error fácilmente se habría podido corregir con una línea antes de cerrar el ciclo. Si leiste mi post, decía que eso no es NECESARIAMENTE el problema. Claro, viendo tu post (y, mejor, el link) si aparece el error, pero recién ahí.
Lo más fácil y presentable, de hecho, era prescindir de un par de líneas antes. Era mejor código y error-free.

@Guillermo,
Creo que no lo captaste del todo. Sigue el código considerando los siguientes tips:
-A esta función, le ingresas la cantidad de días desde el 1 de enero del “año de origen” (1980).
-restas de 366/365 días (año bisiesto/normal) a la vez que sumas un año. Te quedas, al finalizar el while, con el índice de día (número) del año en curso. Como al ir restando la cantidad de días del año, además incrementas la variable year, también tienes el año (recuerda, vas incrementando desde 1980).
-Para obtener el mes y el día del mes opera parecido, considerando que el arreglo monthtable puede ser {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} o {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} dependiendo de si el año es bisiesto o no…
Más claro? Bueno, léelo con detención.. el código se explica a si mismo mejor de lo que yo te lo puedo tratar de explicar.

hashing

DesaprobarAprobar0hashing dijo el 3-1-2009 a las 00:19:

54

@Gon,
si, dicen que a veces el mejor código es NO ESCRIBIR código… a veces aplica bastante bien.

Felipe

DesaprobarAprobar-1Felipe dijo el 3-1-2009 a las 00:50:

55

juaujajuauja error ql xD
como mierda se les paso xD

Nicolas Goles

DesaprobarAprobar1Nicolas Goles dijo el 3-1-2009 a las 01:02:

56

BOOL ConvertDays(UINT32 days, SYSTEMTIME* lpTime)
{
int dayofweek, month, year;
UINT8 *month_tab;

//Calculate current day of the week
dayofweek = GetDayOfWeek(days);

year = ORIGINYEAR;

while (days > 365) // days = 366 … entra en el while…
{
if (IsLeapYear(year)) // Es biciesto asi que entra en el if ( 366 días )
{
if (days > 366) // el numero de dias NO es mayor a 366 , no entra en el if…
{
days -= 366;
year += 1;
}
}

else // NO entra en el else y se re-evalúa la condición del while. days sigue siendo > a 365, por lo que cae en el inf loop.
{
days -= 365;
year += 1;
}
}

es trivial de ver este error… Por eso se arregló un día después, por que ahí el if dentro de if ( IsLeapYear(year)) fué válido ( el contador de días llegó a 367). Entonces se decrementó days y aumentó year y listo.

La solución es trivial.

Ah! y para los que hablaban de C# , no son muchos ( que yo conozca ) , los dispositivos móbiles que tienen la Virtual Machine ( Common Language Runtime) instalada… te gastaría rapidito la batería del zune… por eso al final C la lleva jajaja

Saludos :)

PD : No pude identar bien el código, se re-identa solo.

Guillermo

DesaprobarAprobar4Guillermo dijo el 3-1-2009 a las 01:17:

57

@hashing exacto, pero si le pones un if (days >= 366) entrara al if con el indice en 366 y al restarle 366 el indice de dias te queda en 0, que dia del año es el dia 0?

carlos

DesaprobarAprobar3carlos dijo el 3-1-2009 a las 01:57:

58

soy programador…y si el error es tonto, de alguna manera para los que entienden, mi pregunta va mas alla, listo se vio el error (sea tonto o no, ese es otro tema….) pero porque solo en los modelos de 30 gigas..que paso con los demas, acaso los demas tienen programacion diferente , se programa cada modelo desde cero, lo dudo..algo debe pasar en los modelos de programacion de microsoft…vamos, los que saben programar saben que empresa que se respete tiene equipos de desarrollo, algo debe pasar para que ese error se colara, porque microsoft tiene su framework .net y ahi hay muchas librerias que manejan fechas, porque escribir el codigo de nuevo…en fin…son solo cosas que me dan vueltas en la cabeza…

hashing

DesaprobarAprobar0hashing dijo el 3-1-2009 a las 03:14:

59

@Guillermo,
disculpa, no entendí para nada tu post anterior.
Lo que apuntas es cierto, por eso mi queja anterior, sin haber visto cómo cerraba el ciclo, si agregabas una condición más antes de cerrar el while – if(days==366 && IsLeapYear(year)) break; – no existía el error. Evidentemente hay soluciones más elegantes, de todos modos. Por otra parte, como bien señalas, es trivial ver que el <= lleva a otro bug (no un loop infinito, de todos modos).

Temo

DesaprobarAprobar2Temo dijo el 3-1-2009 a las 03:30:

60

De hecho, voy a revelarles el verdadero codigo del error:

if dia=”31 de diciembre de 2008″ and ipod=”sigue dominando el mercado” then
unload me() or killmyself(dont wake me up)
end if

Jaja q mensada, pero asi es…

casty

DesaprobarAprobar-1casty dijo el 3-1-2009 a las 05:20:

61

if (days >= 366)

Gon con ese código, solo consigues que el día 31 de Diciembre de un año bisiesto se convierta en el 1 de Enero del siguiente, lo cual sigue siendo erróneo (Aunque no cuelga el Zune, claro).

El error tampoco está en el bucle while, ya que es necesario en el caso de que dejes apagado el Zune más de un año.

La forma chapucera de arreglarlo sería poner un else break en el if de 366. Pero no me gustan los breaks en los bucles, así que dejo abierta la solución que no me apetece pensar hoy.

Daniel

DesaprobarAprobar0Daniel dijo el 3-1-2009 a las 06:20:

62

Derrepente el planeta del programador del código del RTC del ZUNE es de otro planeta donde si tienen 367 días, ¿pensaron en eso? :)

Carlos Le+Mare

DesaprobarAprobar4Carlos Le+Mare dijo el 3-1-2009 a las 07:20:

63

Con el código fuente le quedó claro a mi abuelita por qué no le funciona el Zune… cuando lo leyó dijo:

“Mire mijhito, mi Zune no funciona por ese evidente bug”.

jaja

TheDaVis Blog &mdash; La línea de la muerte de los Zune (o de la vída&#8230;)

DesaprobarAprobar-1TheDaVis Blog — La línea de la muerte de los Zune (o de la vída…) dijo el 3-1-2009 a las 08:37:

64

[...] Fayerwayer En: Blog — Enero 3, 2009 | [...]

Lainon

DesaprobarAprobar1Lainon dijo el 3-1-2009 a las 09:09:

65

No es:

if (days = 367)
{
printf (”WTF?!”);
}

Hay un evidente error en la condición. Si haces eso, estarás asignando el número a la variable y siempre será True. La versión correcta sería:

if (days == 367)
{
printf (”WTF?!”);
}

No me resistía a decirlo… :)

el_dva,

DesaprobarAprobar3el_dva, dijo el 3-1-2009 a las 09:23:

66

Corrijo, el error no esta en la condicion if, el codigo esta correcto, pero solo le falta una linea, despues del if un “else break” para salir del ciclo, ya no tiene sentido restar dias cuando queda 365 y es año bisiesto.

@la mayoria: recuerden que la variable days tiene los dias transcurridos desde 1/01/1980 asi que puede ser mayor a 365 incluso puede llegar a 367 caso 01/01/2009.

@Gon: recuerda que esto va a una pieza de harware, meter librerias mas complejas, hace que ocupen espacio necesario, ve que despues esto se compila a asembler o hex para el microcontrolador.

Juano

DesaprobarAprobar0Juano dijo el 3-1-2009 a las 10:42:

67

A mi me dijeron que esa parte de codigo se embebe una vez que reproduciste mas de cuatro veces un tema de La Mona Jimenez en el termino de un anio. Para los interesaods: el codigo que hace esto empieza en la linea 415.

esmetaman

DesaprobarAprobar0esmetaman dijo el 3-1-2009 a las 11:06:

68

Esto es lo que pasa cuando no hay un buen testeo de software. Sera que esas rutinas de conversion de fechas no estan por la red y libro de bugs….

Los Zune de 30 GB deciden suicidarse todos al mismo tiempo la noche del 31 - Burbuja Económica

DesaprobarAprobar-1Los Zune de 30 GB deciden suicidarse todos al mismo tiempo la noche del 31 - Burbuja Económica dijo el 3-1-2009 a las 11:07:

69

[...] al código fuente del Zune revela orden de suicidio Autopsia al código fuente del Zune revela orden de suicidio Para los más fanáticos o para aquellos que requieren de una explicación lógica ante un problema [...]

Noname

DesaprobarAprobar2Noname dijo el 3-1-2009 a las 11:15:

70

Punteros en C# ¿? quien ha sido el fumado que ha dicho que es c#¿? …

Por cierto… la gente de micro no hace pruebas unitarias ¿? FLIPO

Guillermo

DesaprobarAprobar2Guillermo dijo el 3-1-2009 a las 11:46:

71

@el_dva, Exacto, con un else break se arregla el error, es bastante poco elegante pero sirve. A eso iba, me cuesta explicar para que entienda alguien aparte de mi, pero en el fondo era que la solucion que se estaba planteando antes que con un simple signo = se arreglaba no servía y la mayoría no veía el problema.

Crash Override

DesaprobarAprobar0Crash Override dijo el 3-1-2009 a las 12:38:

72

@Gon buena tu explicación. Es exactamente lo que pasa con este codigo. Lo penca es darse cuenta que este error basico no lo pudieron corregir antes que saliera a su venta…si es Microsoft!!!

Andres

DesaprobarAprobar0Andres dijo el 3-1-2009 a las 12:52:

73

@el_dva: Pero si agregas un break no contabilizas el último año y te quedas con el año en 2008.

hashing

DesaprobarAprobar0hashing dijo el 3-1-2009 a las 13:01:

74

@Andres,
El conflicto es el día 366 de un año bisiesto, no el primero del año siguiente.
Con un break corriges el error.

Temo

DesaprobarAprobar-3Temo dijo el 3-1-2009 a las 15:05:

75

Todos los zuneS de 30 gb valieron reata!!! Entonces…. aqui esta el codigo q los orillo al suicidio..

while zune_trend = “Microsoft”
if zune < ipod_classic and zune < ipod_nano then
if zune < every_mp3_player then
if zune_cap = 30 Gb then
zune_scr = clrscr()
zune_scr = backcolor.blue
zune_health = 0
zune_restart.enable = “False”
end if
end if
end if
end while

Una vez que ese codigo sea remplazado el zune brillara de nuevo… jajaja

Guillermo

DesaprobarAprobar0Guillermo dijo el 3-1-2009 a las 15:10:

76

Eso no iva ahi, pueden enterrar el comentario, lo siento xD

seba

DesaprobarAprobar0seba dijo el 3-1-2009 a las 16:11:

77

que tiene de diferente C o C#

Nicolas Goles

DesaprobarAprobar0Nicolas Goles dijo el 3-1-2009 a las 17:02:

78

ufff. . harto… google it

CuchoLeo

DesaprobarAprobar0CuchoLeo dijo el 3-1-2009 a las 17:58:

79

me costo pero lo entendi hahaha , saludos a M$

Francisco

DesaprobarAprobar1Francisco dijo el 3-1-2009 a las 20:57:

80

@LOL es C++, no C#. En C# no puedes llamar a un método sin haber instanciado un objeto, lo cual C++ si puede, pues hereda esa funcionalidad del C.

CuchoLeo

DesaprobarAprobar0CuchoLeo dijo el 3-1-2009 a las 21:28:

81

haber pero se podria haber puesto if (days ==366) , poq n en ningun caso va a haber un numero mayor a 366 …, alguien que me responda :)

Guillermo

DesaprobarAprobar1Guillermo dijo el 4-1-2009 a las 00:34:

82

@CuchoLeo Si llega a 367, o en este caso DEBERIA llegar (ya que a esto se debe el error) x ejemplo el 1 de enero del 2009, recuerda que es un contador de dias, no quiere decir que algun año tenga 367 dias, sino que como un año bisiesto tiene 366 dias, cuando llegue a 367 el contador, debe restarle 366 al contador de dias (asi lo deja en 1) y sumarle 1 al indice de años, asi x ejemplo lo que debería hacer el codigo es cndo pasaron las 12 de la noche del 31 de dic. el contador de dias debia subir a 367 y asi meterse al if (days > 366) y restarle 366 y asi dejar el contador d dias en 1 del año 2009, x esto el break corrige el error y no así agregarle el signo = al if, ojala se haya entendido, salu2 =)

Guillermo

DesaprobarAprobar1Guillermo dijo el 4-1-2009 a las 00:43:

83

A nadie se le ocurrió una solución dsitinta a la del break? Yo cuando lo vi, pense en eso, pero no me gustan los break dentro de un bucle, es poco elegante y puede traer problemas, es como “feo” =P, pero no se me ocurre algo + correcto, en realidad no he pensado mucho pero me da paja xD.

TurboMAC

DesaprobarAprobar-2TurboMAC dijo el 4-1-2009 a las 01:20:

84

@Fayerwayer: Por que borraron mi primer post??? Acaso no les gusta usar su derecho de libre expresion?? Pues a mi tambien.

hashing

DesaprobarAprobar-1hashing dijo el 4-1-2009 a las 02:21:

85

@Guillermo,
sin dudas hay otras soluciones. Por mi parte, no tengo ningún problema contra los breaks. Bien pensados, no tienen por qué traer problemas, y tampoco son feos. Este código en particular con un break al final queda poco elegante para mi gusto, pero no es una generalidad. No por ahorrarte un break el código va a ser “más correcto”, en eso no concuerdo para nada.

freeze

DesaprobarAprobar-2freeze dijo el 4-1-2009 a las 02:29:

86

muchos de los que comentan aquí son unos verdaderos imbéciles para programar (conste que no dije todos), aquí la culpa es del programador, para eso existen pruebas unitarias, de integración, etc.

Y también los grandes culpables son los “testers”, que seguramente no consideraron este caso importante en sus casos de prueba.

NadieEnParticular

DesaprobarAprobar0NadieEnParticular dijo el 4-1-2009 a las 08:28:

87

//Otra pedazo de código que no aporta nada nuevo
BOOL ConvertDays(UINT32 days, SYSTEMTIME *lptime)
{
int dayofweek, month, year;
UINT *month_tab;

//Calculate current day of the week
dayofweek = GetDayOfWeek(days);

for (year = ORIGINYEAR; days > 365; year++)
{
//Si estoy acá, día vale al menos 366
//¿Por qué comprobar dos veces lo mismo?

if (IsLeapYear(year))
{
days-=366;
}
else
{
days-=365;
}
}

//buscar el mes, etc,etc
//Cargar lptime
return TRUE;
}

//Saludos.

Links 4/01/09

DesaprobarAprobar0Links 4/01/09 dijo el 4-1-2009 a las 12:31:

88

[...] y la Autopsia al código fuente del Zune revela orden de suicidio… ¿Si querian morir, por que no lo permitieron? [...]

Saint

DesaprobarAprobar5Saint dijo el 4-1-2009 a las 12:44:

89

No me quiero ni imaginar entonces el código fuente de Windows Vista o Windows ME!!!

Con razón MS nunca ha querido liberar el código fuente… no es por una razón comercial, es porque les da vergüenza!!

CuchoLeo

DesaprobarAprobar0CuchoLeo dijo el 4-1-2009 a las 14:24:

90

gracias guillermo por la aclaracion :)

Lolo

DesaprobarAprobar-1Lolo dijo el 4-1-2009 a las 15:05:

91

Es triste… nadie reconoce el trabajo de los informáticos, sólo se acuerdan de nosotros cuando ocurren embarradas como éstas…

:’(

hola hola

DesaprobarAprobar-1hola hola dijo el 5-1-2009 a las 12:47:

92

10 print “no entendi ni huea”
20 goto 10
run

michael

DesaprobarAprobar-1michael dijo el 5-1-2009 a las 13:33:

93

obvio pa eso estamos

Maxi

DesaprobarAprobar1Maxi dijo el 6-1-2009 a las 09:35:

94

el lenguaje de progranmacion que usan es el maxelocked code!! aprendan freakis lolS!!!

donboa

DesaprobarAprobar0donboa dijo el 7-1-2009 a las 16:05:

95

Tanto color por un signo =.

jajajajaja

Al otro lado del mostrador &raquo; ¿Qué les pasó a los Zunes de 30 gigas?, estábamos allí

DesaprobarAprobar0Al otro lado del mostrador » ¿Qué les pasó a los Zunes de 30 gigas?, estábamos allí dijo el 8-1-2009 a las 05:39:

96

[...] varios blogs y webs, (aquí por ejemplo en FayerWayer) se ha dado la explicación técnica de como se ha producido ese fallo. Recomiendo la lectura de [...]

Fernando

DesaprobarAprobar0Fernando dijo el 8-1-2009 a las 09:34:

97

El error no es que days = 367, eso es correcto, ya que ese día es el que tiene que convertir a primero del año próximo.

El problema es el while. Debería ser un if.

Al ser un while, el días 366, entra en el bucle, pero como es bisiesto aún no tiene que pasar a primero de enero, por lo tanto no cambia la variable days y no sale del bucle.

Creo que deberían ser más respetuosos con el trabajo de otros, este es un error simple, pero que le puede pasar a cualquiera, es fácil desde el anonimato de internet acusar a un programadro de haberce equivocado en una línea de código, pero los que programamos día a día, sabemos que estos errores son frecuentes y no son fáciles de evitar.

Un saludo.

citadino

DesaprobarAprobar0citadino dijo el 10-1-2009 a las 22:49:

98

Aqui creo que la metida de pata viene de usar directamente los números de días dentro del código y no haberlos declarado como nombres de constantes al inicio del script/programa. Aunque parezca bien poner la cantidad de días del año directamente en TODO el código, si hubiesen usado dos constantes con nombres como “TotalDaysNormalYear” y “TotalDaysLeapYear” hubieso sido más fácil leer el código para distinguir los dos condicionales (el del “if” y el del “while”) y evitar el error. Una persona tal vez cansada o apática se podría confundir tratando de diferenciar entre los números 365 y 366.

Tip para sus próximos proyectos de programación…

Duende

DesaprobarAprobar0Duende dijo el 31-1-2009 a las 02:57:

99

yo no creo que los de microsoft suelten asi no mas el codigo de sus aplicaciones…. de donde lo sacaron es una pagina para colocar codigos fuentes …. si es un chiste… (aparte del “error”) pues no lo entendí.. saludos

ciao

Brandon Alvarez

DesaprobarAprobar0Brandon Alvarez dijo el 6-2-2009 a las 17:47:

100

jajaja lo bueno esque solo es con el zune 30GB con el 80GB no!! y menos con el 120GB ok Salu2

Don QUijote de Nicaragua

DesaprobarAprobar0Don QUijote de Nicaragua dijo el 2-3-2009 a las 18:08:

101

Bueno, ahora que a veces miro mis errores en los sistema que desarrollamos ya me siento mas tranquilo jajaja al mejor mico se le cae el sapote como decimos aqui.

Deja tu Comentario

XHTML: Puedes usar: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Previsualizar comentario?