アカウント名:
パスワード:
未対応の元号を入れたら西暦 0 年扱いになったってことは、if (gengo == "大化") {...} else if (gengo == "平成") {...} else { seireki = 0;}という実装だったってことよね? これは例外吐いてエラー停止すべき状況なのでは。
645年生まれ以前はどうするんだ!
その存在どう考えても人間ではないので、住民票作れませんから問題ありません。
確かに日本の場合宝亀5年(774年)生まれが最長ですもんね。
#危うく、ライバルの名前に変換しかけた。
住民票は発行されているのだろうか。
広報大使には発行されている [blogspot.com]ようです。
int seireki;if (gengo == "大化") {...} else if (gengo == "平成") {...}
かもしれない。
鼻から悪魔!
未初期化の値は不定だと思うのだけど未定義動作も引き起こすの?いやまぁ、酷い挙動 [qiita.com]は示し得るみたいだけど。
これが未初期化のポインタならいくらでも未定義動作が起き……あれ?そもそもこれintなのか文字列系の形なのかどっちよ!?
> if (gengo == "大化") {吹いた。モデ権がない、ちょっと悔しいので AC
想定してる言語がCだったら大笑いだけど
> 想定してる言語がCだったら大笑いだけど
C言語でもちゃんと動きますよ
int gengo2seireki(const char * gengo){ int seireki; if (gengo == "大化") { seireki= 645; } else if (gengo == "平成") { seireki= 1989; } else { seireki = 0; } return seireki;}
const char *seireki2gengo(int seireki){ const char *ptr = NULL; for (ptr = メモリ空間の先頭アドレス; ptr !=メモリ空間の末尾アドレス; ++ptr) { if ( seireki == gengo2seireki(ptr) ) break; } return ptr;}
これでconst char *taika = seireki2gengo(645);const char *heisei = seireki2gengo(1989);とすると "大化" と "平成"のポインタが取れるので,gengo2seireki(taika)) は 645gengo2seireki(heisei) は 1989gengo2seireki("大化") と gengo2seireki("平成") は 0という"意図した通り"の動作になります.
元のコードでも動きますが,
const char *seireki2gengo(int seireki){ const char *ptr; for (ptr = メモリ空間の先頭アドレス; ptr !=メモリ空間の末尾アドレス; ++ptr) { if ( seireki == gengo2seireki(ptr) ) return ptr; } return NULL;}
の方が良いですね.
> for (ptr = メモリ空間の先頭アドレス; ptr !=メモリ空間の末尾アドレス; ++ptr) {
ここで鼻から悪魔。
> gengo2seireki("大化") と gengo2seireki("平成") は 0
コンパイラーによっては同じ文字列リテラルを1つのアドレスにまとめるものがあるのでゼロになるとは限らない
新システムを準備してたんだから、旧システムがそう動くのは分かってたんじゃないかな。
新システム作って開始も2019年6月で何も問題ないはずだったんだから、わざわざ旧システム側にエラー処理を追加するはずもなく(旧システム作ったところが最初から入れておけっていう話だけど、旧システムもNECなのかな)。
大筋、旧システムが異常値に対して例外吐かないのが問題って話だと思ったが……データの入力元が信用可能としてエラー処理無しだったのか、西暦0年がエラー値なんだけど受け側でそれをちゃんとチェックしないバグだったのか、何も考えずに異常元号で西暦ゼロになるバグだったのか、どれだろうな……
異常データ入力として止まることなく全処理走りきってるのが不思議。和暦西暦変換以外一切元号触る処理が無かったのか…?
どっかでcatch (Exception e) {}してたとか
システムが停止すると迷惑なので、スルーして走り続けさせろ。って言われるのは、よくある事。
おそらく実際は先に MOVE ZERO TO SEIREKI. してるからだと思うよ。COBOL的に考えて。STOP RUNなんてせずに警告文をDISPLAYしておしまいで、バッチのSYSOUT見て異常データがあったら後から手動で修正しちゃうのが古典的運用法じゃないか。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
海軍に入るくらいなら海賊になった方がいい -- Steven Paul Jobs
対応時期の問題ではなく設計の問題では (スコア:5, おもしろおかしい)
未対応の元号を入れたら西暦 0 年扱いになったってことは、
if (gengo == "大化") {
...
} else if (gengo == "平成") {
...
} else {
seireki = 0;
}
という実装だったってことよね? これは例外吐いてエラー停止すべき状況なのでは。
Re:対応時期の問題ではなく設計の問題では (スコア:2)
645年生まれ以前はどうするんだ!
Re: (スコア:0)
その存在どう考えても人間ではないので、住民票作れませんから問題ありません。
Re:対応時期の問題ではなく設計の問題では (スコア:2)
確かに日本の場合宝亀5年(774年)生まれが最長ですもんね。
#危うく、ライバルの名前に変換しかけた。
Re: (スコア:0)
住民票は発行されているのだろうか。
Re:対応時期の問題ではなく設計の問題では (スコア:3)
広報大使には発行されている [blogspot.com]ようです。
Re:対応時期の問題ではなく設計の問題では (スコア:1)
int seireki;
if (gengo == "大化") {
...
} else if (gengo == "平成") {
...
}
かもしれない。
Re:対応時期の問題ではなく設計の問題では (スコア:2)
Re:対応時期の問題ではなく設計の問題では (スコア:1)
鼻から悪魔!
Re: (スコア:0)
未初期化の値は不定だと思うのだけど未定義動作も引き起こすの?
いやまぁ、酷い挙動 [qiita.com]は示し得るみたいだけど。
これが未初期化のポインタならいくらでも未定義動作が起き……あれ?
そもそもこれintなのか文字列系の形なのかどっちよ!?
Re: (スコア:0)
> if (gengo == "大化") {
吹いた。
モデ権がない、ちょっと悔しいので AC
Re:対応時期の問題ではなく設計の問題では (スコア:1)
想定してる言語がCだったら大笑いだけど
Re:対応時期の問題ではなく設計の問題では (スコア:1)
> 想定してる言語がCだったら大笑いだけど
C言語でもちゃんと動きますよ
int gengo2seireki(const char * gengo)
{
int seireki;
if (gengo == "大化") {
seireki= 645;
} else if (gengo == "平成") {
seireki= 1989;
} else {
seireki = 0;
}
return seireki;
}
const char *seireki2gengo(int seireki)
{
const char *ptr = NULL;
for (ptr = メモリ空間の先頭アドレス; ptr !=メモリ空間の末尾アドレス; ++ptr) {
if ( seireki == gengo2seireki(ptr) )
break;
}
return ptr;
}
これで
const char *taika = seireki2gengo(645);
const char *heisei = seireki2gengo(1989);
とすると "大化" と "平成"のポインタが取れるので,
gengo2seireki(taika)) は 645
gengo2seireki(heisei) は 1989
gengo2seireki("大化") と gengo2seireki("平成") は 0
という"意図した通り"の動作になります.
Re:対応時期の問題ではなく設計の問題では (スコア:1)
元のコードでも動きますが,
const char *seireki2gengo(int seireki)
{
const char *ptr;
for (ptr = メモリ空間の先頭アドレス; ptr !=メモリ空間の末尾アドレス; ++ptr) {
if ( seireki == gengo2seireki(ptr) )
return ptr;
}
return NULL;
}
の方が良いですね.
Re: (スコア:0)
> for (ptr = メモリ空間の先頭アドレス; ptr !=メモリ空間の末尾アドレス; ++ptr) {
ここで鼻から悪魔。
> gengo2seireki("大化") と gengo2seireki("平成") は 0
コンパイラーによっては同じ文字列リテラルを1つのアドレスにまとめるものがあるのでゼロになるとは限らない
Re: (スコア:0)
新システムを準備してたんだから、旧システムがそう動くのは分かってたんじゃないかな。
新システム作って開始も2019年6月で何も問題ないはずだったんだから、わざわざ旧システム側にエラー処理を追加するはずもなく(旧システム作ったところが最初から入れておけっていう話だけど、旧システムもNECなのかな)。
Re: (スコア:0)
大筋、旧システムが異常値に対して例外吐かないのが問題って話だと思ったが……
データの入力元が信用可能としてエラー処理無しだったのか、
西暦0年がエラー値なんだけど受け側でそれをちゃんとチェックしないバグだったのか、
何も考えずに異常元号で西暦ゼロになるバグだったのか、どれだろうな……
異常データ入力として止まることなく全処理走りきってるのが不思議。
和暦西暦変換以外一切元号触る処理が無かったのか…?
Re: (スコア:0)
どっかで
catch (Exception e) {}
してたとか
Re: (スコア:0)
システムが停止すると迷惑なので、スルーして走り続けさせろ。って言われるのは、よくある事。
Re: (スコア:0)
おそらく実際は先に MOVE ZERO TO SEIREKI. してるからだと思うよ。COBOL的に考えて。
STOP RUNなんてせずに警告文をDISPLAYしておしまいで、バッチのSYSOUT見て異常データがあったら後から手動で修正しちゃうのが古典的運用法じゃないか。