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

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;
    }

6 votes, average: 3.50 out of 56 votes, average: 3.50 out of 56 votes, average: 3.50 out of 56 votes, average: 3.50 out of 56 votes, average: 3.50 out of 5 (6 votes, average: 3.50 out of 5)
You need to be a registered member to rate this post.
Loading...
Tecnología | RSS 2.0 |     723 views

RSS feed

4 Comments »

Comment by phylevn
2009-01-04 21:23:03

No estoy seguro.. pero supongo que cuándo días es igual a 366 se cicla la rutina..

 
Comment by cosmocrator
2009-01-04 23:59:36

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

 
Comment by mahomedalid
2009-01-05 10:50:49

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 …
)

Comment by KBrown
2009-01-05 23:46:26

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…….

 
 
Name (required)
E-mail (required - never shown publicly)
URI
Your Comment (smaller size | larger size)
You may use <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> in your comment.

Trackback responses to this post