Programacion para novatos (o el porque de la falla del zune)

0
(0)

via http://www.aeroxp.org/2009/01/lesson-on-infinite-loops/ revelan el codigo que causo la falla global del Microsoft Zune de 30gb. Es tan simple que da pena…a ver si la cachan:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    #define ORIGINYEAR 1980 
    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 <= month_tab[month])
                break;
            days -= month_tab[month];
        }
 
        month += 1;
 
        lpTime->wDay = days;
        lpTime->wDayOfWeek = dayofweek;
        lpTime->wMonth = month;
        lpTime->wYear = year;
 
        return TRUE;
    }

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

4 thoughts on “Programacion para novatos (o el porque de la falla del zune)

  1. Achis, y cómo le hace para saber si el mes es de 30 días o de 28 o de 31?

    Digo, lo mio, lo mío, lo mio no es la programación, pero no veo como el puede hacer ese escrito para saber en que mes esta y cuantos días tiene.

    A lo mejor hasta tiene otros detalles, pero asumo que sabe que el día tiene 24 horas y que sabe contarle los minutos y los segundos.

    No? no me saque ni medio punto?

    Chale!!!!!

    Cosmo

  2. Creo que el problema es que no sabemos leer, a mi me pasa muy seguido. Si la liga es “http://www.aeroxp.org/2009/01/lesson-on-infinite-loops/” deduzco que hay un loop infinito ahí. Creo que esto:

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

    Lo que puede ocasionar el loop infinito es que los días pueden ser 366 (mayores a 365 entrar a IsLeapYear(year)) y nunca mayores a 366 (nunca entrar a days > 366) y dar vueltas … y vueltas … y vueltas …
    )

    1. Para que ninguna condición se cumpla tiene que tratarse de un año bisiesto de 366 días. Y, desde que recuerdo, todos los años bisiestos que me han tocado han sido de 366 días…. Luego entonces se trata de un loop muy recurrente. Se volverá a presentar en 2012 si es que alguien todavía sigue conservando (sin actualización de firmware) uno de esos aparatos…….

Leave a Reply