パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

Zuneとgigabeatが閏年の処理の問題でフリーズ」記事へのコメント

  • by Anonymous Coward
    Freescaleの参照ドライバがバグっていた模様です。
    閏年の判断が間違ってたわけじゃなくて、1980年1月1日からの日数を閏年を考慮して年初からの日数に直すところで無限ループに入っていたという…
    http://www.zuneboards.com/forums/zune-news/38143-cause-zune-30-leapyea... [zuneboards.com]
    • by Anonymous Coward
      素直に書けば、これだけのこと?

      year = ORIGINYEAR; /* = 1980 */
       
      while (days > (IsLeapYear(year) ? 366 : 365))
      {
        days -= IsLeapYear(year) ? 366 : 365;
        year += 1;
      }
      • by Anonymous Coward
        教科書的に書けばこんな感じ。

        year = ORIGINYEAR; /* = 1980 */
        year_days = IsLeapYear(year) ? 366 : 365;
        while (days > year_days)
        {
            days -= year_days;
            year += 1;
            year_days = IsLeapYear(year) ? 366 : 365;
        }
        • Re: (スコア:1, 参考になる)

          by Anonymous Coward
          両方とも、「IsLeapYear(year) ? 366 : 365;」が複数箇所に記述されてるのは駄目だろう。
          この程度なら余裕で見通せるだろうが、基本的に同一の記述が複数にあると潜在バグの元になる。
          過去の遺産的なつぎはぎ修正のプログラムは、たいていこんなものが散見されて、コピペミスと思われるバグがあったりするよ。
          • by Anonymous Coward
            つまり、実用的に書くとこんな感じ?

            year = ORIGINYEAR; /* = 1980 */
            while (1)
            {
                if (IsLeapYear(year))
                {
                    if (days <= 366) break;
                    days -= 366;
                }
                else
                {
                    if (days <= 365) break;
                    days -= 365;
                }
                year += 1;
            }
            • by Anonymous Coward
              この場合はforで書いたほうが読みやすいよ。

              for (year = ORIGINYEAR; ; year++)
              {
                  if (IsLeapYear(year))
                  {
                      if (days <= 366) break;
                      days -= 366;
                  }
                  else
                  {
                      if (days <= 365) break;
                      days -= 365;
                  }
              }
              • Re: (スコア:1, 興味深い)

                by Anonymous Coward
                これ、実用的なの?ifの中身を同じアルゴリズムにするのと、ローカル変数を一つ増やすのとの差でしょ?

                for (year = ORIGINYEAR;; year++) {
                  year_days = IsLeapYear(year)? 366 : 365;
                  if (days <= year_days)
                    break;
                  days -= year_days;
                }
                おそらく、組み込み系にとっての、という意味だと思うが…。
              • by Anonymous Coward
                実用性云々じゃなくて、

                        year_days = IsLeapYear(year) ? 366 : 365;

                をうっかり、

                        year_days = IsLeapYear(year) ? 365 : 366;

                と、しちゃったりとか、そういうトラブルを未然に防げる、って事だと思う。
              • by Anonymous Coward
                どうしてif文で書くと365と366を書き間違えるトラブルを未然に防げるの?
              • Re: (スコア:1, おもしろおかしい)

                by Anonymous Coward
                三項演算子を知らないプログラマがいるからです。
                保守性を考えた場合、底辺に合わせるしかありません。
              • by Anonymous Coward on 2009年01月02日 14時41分 (#1484385)
                三項演算子も知らないプログラマに保守できるように書いちゃったら自分がクビを切られちゃうじゃないですか!
                管理側の発想としてはとてもよく理解できますけど。
                親コメント

海軍に入るくらいなら海賊になった方がいい -- Steven Paul Jobs

処理中...