VS2008できちんと動くプログラムがBCCやGCCで上手く動かない


堀江伸一  2011-07-17 22:44:45  No: 72823  IP: 192.*.*.*

私はまだまだ勉強中の身で簡単なアルゴリズムの勉強をしています。
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2105
リンク先は東大プログラミングコンテストの問題で、これを参加者である東大生などは20分程度でコードを作り正答するそうです。


私は未熟なので時間がかかり苦労の末に下記リンクのようなコードを書きました。

http://www14.atwiki.jp/c21coterie/?cmd=upload&act=open&page=2011%E5%B9%B47%E6%9C%88&file=2105RhythmMachineTest1.txt
このコードはVS2008できちんと動きますが、BCCやGCCでコンパイルして動かすとおかしなことに楽譜を統合した後に登録される音の数がVS2008の時より減るという不思議な事態が起きます。


コードは最初楽譜を読み取り、全ての音を統合合成してならされる順番に並べます。

allMusicというMapにならされる順に全ての音を。
musicというMapに00(無音)以外をならされる順番をソート基準として音を入れます。


コードは次にmusicから音を取り出しならされる音の最小間隔を調べます。

その間隔でallmusicから取り出して音を出力し、全ての音をきちんともれなくならせるならその間隔で音を出力します。

駄目なら音を鳴らす間隔を更に1/2,1/3、、、と狭めてその間隔でいけるか試すのがコードの大筋です。


もっと賢い方法があるとは思いますが愚直に実装しました。
このコード、最初の加工で音を統合した後、music.size()を調べるとVS2008とbccやgccとでは結果が違い、Vs2008C++では正しい結果を、bccでは正しい結果となりません。
なぜこうなるのか分かりません。


検証用として

採点用入力データはこちらで
http://www14.atwiki.jp/c21coterie/?cmd=upload&act=open&page=2011%E5%B9%B47%E6%9C%88&file=input1.txt
採点用出力データはこちらです。
http://www14.atwiki.jp/c21coterie/?cmd=upload&act=open&page=2011%E5%B9%B47%E6%9C%88&file=output1.txt
私のコードは検証用にテキストファイルに結果を出力しています。
本当は答えはprintfのみで出力します。



検証用に出力したテキストファイルを見てみると、VS2008では出力データと採点データが完全に一致するのですがBCCやGCCで試すと何故か上手く動きません。

私のコードに何かコンパイラ依存の変なコードが混じっているのかもしれませんが自分ではいくら調べても原因がわかりませんでした。

どなたかご指導お願いします。

編集 削除
επιστημη  URL  2011-07-18 06:52:47  No: 72824  IP: 192.*.*.*

ひとつ確認。
fileにではなく、標準出力(cout/stdout)に出力した場合でもうまいこといかんですか?

編集 削除
堀江伸一  2011-07-18 21:47:18  No: 72825  IP: 192.*.*.*

標準出力に出力した場合でも上手くいきません。
VS2008でprintfの結果を全て検証すると全ての答えがきちんとあっていました。
bccでは出鱈目な答えが出てきます。


同じコードをVs2008でコンパイルし採点用データを入力した場合のファイルへの出力結果を掲載します、完全にあっています。
http://www14.atwiki.jp/c21coterie/?cmd=upload&act=open&page=2011%E5%B9%B47%E6%9C%88&file=test1.txt

BCCでコンパイルして採点用データを入力した場合の出力です、かなり出鱈目な結果になっています。
http://www14.atwiki.jp/c21coterie/?cmd=upload&act=open&page=2011%E5%B9%B47%E6%9C%88&file=test.txt

同じコードなのに全く違う結果となります。



例えば下記のようなテストデータを試すと。
vs2008では音を統合した後music.size()が37となりますが、bccではmusic.size()が24となります。
37のほうが正しいのです。

1
2
0008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000100000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000800000000000000000000002000000000000000000000000000000000000000000000000000000000000200000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000040000000000000000000000000000000000000000100000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000
0804000200000000080010000080000008000000200020000004100080081008000040040080000000




VS2008が返す結果
0808000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000200000000000000000000000000000100000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000100000000000000000200000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000100000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000800000000000000000000002000000000000000200000000000000000000000000000000000000000000200000000000400000000000000000020000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000004000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000040000000000080000000000000000000000000000000000000080000000000000000000000000000000000001000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200040004000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000020000000080000000000000040000000000000000000000000000000000000000100000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000


BCCが返す結果。
Too complex.

編集 削除
ボク  2011-07-18 22:49:40  No: 72826  IP: 192.*.*.*

0が多いんで、無駄にメモリを食う幹事だが。

灯台もとクラシですかね。

アハハ。

編集 削除
ボク  2011-07-18 22:58:16  No: 72827  IP: 192.*.*.*

何がやりたいのか知らんが、

PS3を買いなよ。

面白いぞコレ。

編集 削除
ボク  2011-07-18 23:03:24  No: 72828  IP: 192.*.*.*

それにしても灯台はしょうもないねぇ。

それにサイトも古い。

どうせなら、目に見える回答のほうが面白い。
数字で表現してるとこが、バカ丸出し。

PS3を買いなさい。

時間の無駄的なことをしていても、時間がもったいないよ。

時間は、お金では買えない高価なものですから。

編集 削除
堀江伸一  2011-07-19 05:26:57  No: 72829  IP: 192.*.*.*

こういう問題は本当に挑戦すべき難しい問題に挑めるようになるための練習問題のようなものだとおもうのです。
電卓があるからって小学校の算数の勉強が必要でないように、東大生も本当に難しくて必要とされる問題に挑戦できるようになるための基礎練習としてこういう問題を解いていると思います。

実際、今でもコンピュータに関する未解決問題も多く優秀な頭脳が必要とされている分野は多くそれはグラフィックでは表現できない抽象的な問題が多いのです。

ボクさんは3流にふさわしい仕事で生涯を送ったらいいと思います。
3流には一流向けの仕事にどんなものがあるかすら早々できないでしょうし。
PS3は私も持ってますが、私ゲームで時間を無駄にしたから社会の底辺にいるのです。
ゲーム遊んでいる方がよっぽど無駄だと気付いたのが最近です。

編集 削除
堀江伸一  2011-07-19 07:04:54  No: 72830  IP: 192.*.*.*

私は親切な人に親切に、普通に接してくる人には普通に、人を小馬鹿にしてくる人には小馬鹿にして返答します。
なので小馬鹿にした返答をしてみます。

1
まずリンク先問題ですが短時間で気軽に挑戦できることを目的とした問題なので、短時間で答えられるよう数値で答えが出るようになっています。
ボクさんのいうようにグラフィカルにすると時間がかかります。


ボクさんはパックマンのプログラムを書いたことがあるのが自慢だそうですが、パックマンといえば雑誌の中高生向けプログラム連載のいい題材です。
世間では中高生が挑戦する程度の代物だと思われていますよ。


ボクさんを派遣会社の機械設計者に例えるとこんな感じです。
会社には車の設計から簡単な部品の設計しか任せられない設計士まで色々います。
ぼくさん自身は自分がばりばり仕事ができる設計師だと思っています。
優秀な設計師を育てるための数値的な問題(気軽に解ける肩慣らし的問題)を見て、こんな数値計算古臭い、どうせなら3DCADの操作を勉強しなさい。
などと公言しています。
(実際は抽象的な数値計算ができないと難しい設計は出来ません。)

ボクさん本人は自分を仕事ができる人と思い込んでいます。

でも会社の方ではボクさんは簡単なおもちゃを作ったことを(パックマン)自慢にしている程度の人なので簡単な仕事しか任せられないと考えています。

ボクさんは難しい仕事がどんなものか知らず、会社から任せられた仕事をばりばりこなしている自分を有能人だと思い込んでるわけです。
本人はすごく仕事ができているつもり。

というのがボクさんのポジションだと思います。

編集 削除
YuO  2011-07-19 16:08:15  No: 72831  IP: 192.*.*.*

bccもgccも環境が無いですが……。

> vs2008では音を統合した後music.size()が37となりますが、bccではmusic.size()が24となります。
であれば,musicへの追加部分になんらかの違いが出ている可能性が高いですよね。
なので,VC++とTurbo Debuggerなりgdbなりを両方立ち上げて両方でステップ実行をして,
その周辺で値がどう異なるかを調べてみるのが一番手っ取り早そうです。
ありがちなところだと,double型を比較のキーにしていますから,浮動小数点数の誤差ですが……。

編集 削除
ぼく  2011-07-19 21:52:38  No: 72832  IP: 192.*.*.*

だからさぁ、灯台とやらの問題がプログラムがメインなのか、算術がメインなのか、なんだよねぇ(笑)

定義式をプログラに入れるとか、そんなんだろ?

まぁ、灯台はロボコンでも3位とか予選落ちが多い。
平均的に優秀だが、突出した専門君には勝てないんですねぇ。

五目並べのほうが基点やら支点が多いし、キミに手にはおえない?
思考ルーチンプログラムを組んだことが無いだろ?

そうゆうのは、すぐワカルんだよ。ボクわ。

言い訳は、まぁ、いいけどさ(笑)

中2分際で先輩に対して、アレなんですけど。

編集 削除
堀江伸一  2011-07-23 13:45:37  No: 72833  IP: 192.*.*.*

中2でそこまでプログラムができて頭いいのは分かりました。
完敗です。
まあ五目並べはそのうちやりますから。
私みたいな頭の悪い人間に付きまとわないでもっとこう君の頭の良さを分かる人たちの間で自慢したほうがよろしいのではと思います。

YuOさんありがとうございます。
その環境整えて試してみます。

編集 削除
わたし  2011-07-23 14:36:47  No: 72834  IP: 192.*.*.*

ゲームのが面白いのに。

編集 削除