15552000sec

人間死ぬ気になれば・・・というけど、実際のところどうなの?家族へ資産を残すための記録。

なんでこんなプログラムなの?2例

こういうプログラムにたまに出会うと笑ってしまう

 

あるシステムの機能追加をしていて、自分が変更したところじゃない部分で不具合を見つけたので、その原因となったプログラムをみたら、謎のプログラムとなっていたので、ここに書く。

元の言語でなくあえての仮想言語で。

 

function printyaer(string currentyaer)

    string w_yaer=currentyaer  //マジでyaer

    string w_yaer2 = w_yaer

    w_yaer = substr(w_yaer,3,2) //西暦4桁うち下2桁を取得

    w_yaer2 = substr(w_yaer2,3,2)

    int i_yaer = strtoint(w_yaer)

    int i_yaer2 = strtoint(w_yaer2) - 1 //前年を計算

    w_yaer = inttostr(i_yaer)

    w_yaer2 = inttostr(i_yaer2)

    if len(w_yaer) =< 2 then

         w_yaer = "0" + w_yaer

         w_yaer2 = "0" + w_yaer2

    end if

    //結果を出力

    print "当年度=20" + w_yaer

    print "前年度=20" + w_yaer2

end function

 

こんな関数があり、これを

printyaer("2017")

のように呼び出すとどうなるでしょう?

 

これを実行すると、出力はこうなる。

当年度=20017

前年度=20016

寒い。寒すぎる。

このプログラムを作ったのは2001年以降で2010年以前だろう。じゃないとちょっと動かせばわかる。

currentyaerには、プログラム的に常に現在の年をセットしているので、気づかなかったのだろう。もうおかしい出力のまま7年も経ってるはずだが、、、。

yearのスペルミスなんてかわいいもん。

最小の修正なら、if文の=を外せばとりあえずOKになるけど西暦2100年の時に不具合が発生する。そんなところまでプログラムは絶対存在してないと思うけど。

こういう時って他のプログラマーはどうしてるんだろうか。

今回僕はほとんど書き換えて、2100年でも正常に動作するようにはしたんだけど、意味はないね。

っていうか、最初に作った人、、もうちょい考えて作ってくれ、、、。