K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[358] リバーシゲームのはさみ将棋への改造
投稿者:SFファン
2007/02/20 02:13:25

はじめまして。 「JavaWorld」2003年3月号掲載の前橋氏作のリバーシゲームをはさみ将棋に改造しました。 しかし3手読みが限界で強くありません。 そこでVC++への移植を試みました。しかし時々盤オブジェクトの参照でアクセスバイオレーションが起きてしまいます。 Java版と同じ様に盤(cell)をnewしていますが、別クラスもしくはBoardクラスの他のメソッドから見れていない様です。 この件についてJavaWorld経由で前橋氏から解答を貰いましたが盤オブジェクトは構造体にしなければいけない様な事が書いてありました。 以前作りかけていたはさみ将棋に前橋氏作のリバーシゲームを改造したものを上乗せしたので、まだ構造的におかしいですが、問題点があればご指摘をお願いします。 http://revolver.at.infoseek.co.jp/hasami-vc
[この投稿を含むスレッドを表示] [この投稿を削除]
[361] Re:リバーシゲームのはさみ将棋への改造
投稿者:(ぱ)
2007/02/20 02:13:25

>はじめまして。  どうもです。  ここを見ている第三者のために経緯を説明すると、SFファンさんは 既にJavaWorld誌経由で質問されていて、私からも一度回答を返しています。 ただあまり編集さんを煩わせるのもなんですし、よろしければ掲示板の方へ、 と私が書いたので、こちらで質問されたようです。 >そこでVC++への移植を試みました。しかし時々盤オブジェクトの参照で >アクセスバイオレーションが起きてしまいます。 >Java版と同じ様に盤(cell)をnewしていますが、別クラスもしくは >Boardクラスの他のメソッドから見れていない様です。 >この件についてJavaWorld経由で前橋氏から解答を貰いましたが >盤オブジェクトは構造体にしなければいけない様な事が書いてありました。  そういうことを書いた覚えはないですが…  私が書いたのは、以下の通りです。 # その他、本当にC++にすれば速くなるかは疑問、という趣旨のことも書きましたが。 >可能性としては、以下のようなことが考えられるでしょうか。 > >・メンバにアクセス修飾子を付けない場合のデフォルトの意味が、JavaとC++では > 異なる(Javaはデフォルトでパッケージ内丸見えだがC++はデフォルトでprivate)。 >・高速化を狙ったのなら、1手先読みするたびにBoardを毎回newするのではなく、 > Boardをスタック上に確保するような変更を加えたのでしょうか? > もしそうだとして、盤面の配列部分をJava版と同じようにヒープに確保して > いるとすれば、コピーコンストラクタを正しく書かないと動作しません。 > # Boardをスタックに置いておきながら、盤面の配列をヒープに取るようなことは > # 普通しないと思うので、この可能性は薄そうですが。  ひとまず「アクセスバイオレーション」とのことなので、コンパイル時のエラー ではなく実行時のエラーなのでしょう。よってひとつめの可能性は排除できます。  「Java版と同じ様に盤(cell)をnewしていますが」とありますが、もしこれが、 「Boardはスタックにとっているのに2次元配列cellはヒープにとっている」という ことなら、ふたつめの可能性は考慮する価値があるかもしれませんが… 私のソースを直接C++で書き直したのなら、Boardこそヒープに取るでしょうし、 やっぱり可能性は薄いように思います。 >http://revolver.at.infoseek.co.jp/hasami-vc  403 Forbiddenです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[364] Re:リバーシゲームのはさみ将棋への改造
投稿者:SFファン
2007/02/20 02:13:25

当方がWebについて良く知らないため、ダウンロードして貰えなくてすみません。 今回もうまくいかないかも知れませんが、とりあえず貼って見ます。 http://revolver.at.infoseek.co.jp/hasami-vc.lzh
[この投稿を含むスレッドを表示] [この投稿を削除]
[365] Re:リバーシゲームのはさみ将棋への改造
投稿者:(ぱ)
2007/02/20 02:13:25

>http://revolver.at.infoseek.co.jp/hasami-vc.lzh  このリンクから.lzhファイルをダウンロードすることはできました。サイズは301バイト。  解凍してみたら、ショートカットのファイルがひとつだけあらわれました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[368] Re:リバーシゲームのはさみ将棋への改造
投稿者:SFファン
2007/02/20 02:13:25

前回貼った圧縮ファイルには、圧縮前のフォルダだけ圧縮されていた様です。 たびたびすみません。 http://revolver.at.infoseek.co.jp/hasami-vc.lzh
[この投稿を含むスレッドを表示] [この投稿を削除]
[369] Re:リバーシゲームのはさみ将棋への改造
投稿者:(ぱ)
2007/02/20 02:13:25

>http://revolver.at.infoseek.co.jp/hasami-vc.lzh  まず、うちにはVC++をコンパイルする環境はないですし、デバッグまで するつもりもないので、ざっと眺めた感想ですが。  BoardがBoard.cppで定義されていて、#include "Board.cpp"してるとかは さておくとしても、PlayerがBoardの実体を保持していてはいかんでしょう。 Playerがふたりいるとき、それぞれがBoardを抱え込んでいては、ゲームに なりません。  先読みのときBoardをヒープにclone()するのなら、以後それはポインタで 持ち歩いたほうがよさそうに思うのですが、実体で引数渡ししていますし。 Boardの中のcellは、実体で持ってよさそうですがポインタで保持してますし、 にもかかわらずBoardにコピーコンストラクタがありません。  それぞれがaccess violationの原因になるかどうかはさておき、 C++を使うのなら、ポインタと実体の区別を意識するのが重要だと思います。 Javaにはポインタしかないので、Javaから移植するのなら、なんでもかんでも ポインタにするのが楽かもしれません(メモリリークを起こしそうですが)。 なお、ここでは「実体」という言葉を、「ポインタではないデータそのもの」 という意味で使っています。 以前読んだC++本では、引数の参照渡しを「実体渡し」と呼んでてびっくりしました。 「コピーではなく、それそのものを渡す」という意味で「実体渡し」なんだろうと 思いますが、一般的かなあ… 私のように「ポインタではないデータそのもの」の意味で「実体」という言葉を 使うのもさほど一般的ではないかもしれませんが、参照渡しを実体渡しと読んでいるのは その本(およびその本に言及したWebページ)以外では、私は見たことないです。 そんなの広く使われてるじゃん、という方は情報よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[371] Re:実体渡し
投稿者:kit
2007/02/20 02:13:25

話題がそれるので、件名を変更しました。 「参照渡し (call/passing by reference)」と「値渡し (call/passing by value)」が標準的な術語だと思うの で、言葉としては、これを使うのがいいような気がする んですが。言語も C++ ですし。 ただ、Java を含む多くの GC つき言語では、参照の値 渡しをするわけで、この術語は使えませんね。Java と C++ で共通に使える用語としては、「オブジェクト参照 渡し (call/passing by object reference)」と「コピー 渡し (call/passing by copy)」が分かりやすいような 気がします。が、google で探すと、使っている例が少 ないなあ… 特に日本語で「オブジェクト参照渡し」を 使っている例が少ないです。あと、コピー渡しは、値渡 しと同じ意味なので、この対比は実は対称じゃないのも イマイチかも。 「実体渡し」に関しては、google で探して上位に出る サイトでは、「コピー渡し」の意味で使っているサイト ばかりのようですね。でも実体渡しって、日本以外でも 使われている用語なんでしょうか? Python プログラマで一人、"call by object reference" のことを指して "call by object" と呼んでいる例が見 つかりましたが、これだと、日本語と英語で意味が逆に なりますし。 http://aspn.activestate.com/ASPN/Mail/Message/python-Tutor/509290 「実体渡し」を英語に訳すとすると、どうなるんでしょう?
[この投稿を含むスレッドを表示] [この投稿を削除]
[372] Re:実体渡し
投稿者:(ぱ)
2007/02/20 02:13:25

>「参照渡し (call/passing by reference)」と「値渡し >(call/passing by value)」が標準的な術語だと思うの >で、言葉としては、これを使うのがいいような気がする >んですが。言語も C++ ですし。 同意します。私自身、「ポインタ完全制覇」でも「Java謎+落とし穴~」でも、 「値渡し」という言葉を使用しています(どこかで「実体渡し」という言葉を 使っているかもしれませんが…)。 ただ、「PlayerがBoardの実体を保持していてはいかんでしょう。」といった 話をするときには、「実体」またはそれに類する言葉が要るのではないかと 思っています。 おっしゃるとおり、術語としてちゃんと定義されてなさそうなので、誤解を 招く可能性があると思うのですが。そのために、先の投稿で注釈をつけたわけです。 >ただ、Java を含む多くの GC つき言語では、参照の値 >渡しをするわけで、この術語は使えませんね。 ええと、少なくともJavaやCなら「値渡ししかない」で済みそうな気がするのですけど。 >Python プログラマで一人、"call by object reference" >のことを指して "call by object" と呼んでいる例が見 >つかりましたが、これだと、日本語と英語で意味が逆に >なりますし。 日本人でも、「オブジェクト==参照」という解釈の人もいるようですから、 「日本語と英語で意味が逆」になるわけでもないような気がします。 http://www.rubyist.net/~matz/?date=20030730 | もっとも多くの言語には「オブジェクト」でない「値」もある。 | またCの例を出すと、構造体はオブジェクトではない。代入によって | コピーが発生するからだ。 BASICの文字列もオブジェクトではない。 最初読んだとき、かなり違和感がありました。「参照」と「値」の話なら その通りですが、上記の文を読む限り、「オブジェクト」が「参照」と ほぼ同義で使われているからです。 >http://aspn.activestate.com/ASPN/Mail/Message/python-Tutor/509290 ざっと読みました。 | (2) there is no pointer type in Python, so you *can't* pass "a | reference" to an object Pythonは(Javaと同様)なんでもかんでも参照だと思っていましたが、 これはどういう意味でしょう。変数への参照が取れないってことかなあ。 # でも「you *can't* pass "a reference" to an 『object』」だしなあ。 ## 私がPythonについて誤解しているようでしたらご指摘くださいませ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[373] Re:実体渡し
投稿者:kit
2007/02/20 02:13:25

引用の順序を変更しています。 > ただ、「PlayerがBoardの実体を保持していてはいかんでしょ > う。」といった話をするときには、「実体」またはそれに類 > する言葉が要るのではないかと思っています。 そうですね。 念のために言うと、僕も、実体という言葉に対して(ぱ)さんと 同じ感覚を持っています。 > > Python プログラマで一人、"call by object reference" > > のことを指して "call by object" と呼んでいる例が見つ > > かりましたが、これだと、日本語と英語で意味が逆になり > > ますし。 > > 日本人でも、「オブジェクト==参照」という解釈の人もいる > ようですから、「日本語と英語で意味が逆」になるわけでも > ないような気がします。 以下の松本さんの例もそうなんですね。 > http://www.rubyist.net/~matz/?date=20030730 > | もっとも多くの言語には「オブジェクト」でない「値」も > | ある。またCの例を出すと、構造体はオブジェクトではな > | い。代入によってコピーが発生するからだ。 BASICの文字 > | 列もオブジェクトではない。 > 最初読んだとき、かなり違和感がありました。「参照」と > 「値」の話ならその通りですが、上記の文を読む限り、「オ > ブジェクト」が「参照」とほぼ同義で使われているからです。 まったく同様な違和感があります。 > >http://aspn.activestate.com/ASPN/Mail/Message/python-Tutor/509290 > ざっと読みました。 > | (2) there is no pointer type in Python, so you > | *can't* pass "a reference" to an object > Pythonは(Javaと同様)なんでもかんでも参照だと思っていま > したが、 それで合ってると思います。 > これはどういう意味でしょう。変数への参照が取れないって > ことかなあ。 参照への参照が取れないってことでしょうね。 > # でも「you *can't* pass "a reference" to an 『object』」 > # だしなあ。 > ## 私がPythonについて誤解しているようでしたらご指摘く > ## ださいませ。 上の記事の著者である Tim Peters が言う "object" というの は、松本さんの言う object と同じもの、すなわち我々の感じ るところの「object への参照」のことなので、特に矛盾はな いと思います。 Smalltalk や Ruby など、全ての型が object である言語で育 つと、自然にこういう感覚になるのかもしれませんが、機械語 による実装を見て意味を理解するタイプの人間からすると、 ちょっとついていけない感じですね。 で、我々の感覚でいう「オブジェクトへの参照の値渡し (call by object reference)」は、Tim Peters や松本さんのような 感覚を持つ人にとっては、 実体渡し == "call by object" となるわけです。 結局、以下の懸念は、まったく当たっており、注釈をつけたの は正解だということになると思います。 > おっしゃるとおり、術語としてちゃんと定義されてな > さそうなので、誤解を招く可能性があると思うのです > が。そのために、先の投稿で注釈をつけたわけです。 同様に、 > 参照渡しを実体渡しと読んでいるのはその本(および > その本に言及したWebページ)以外では、私は見たこと > ないです。そんなの広く使われてるじゃん、という方 > は情報よろしくお願いします。 についても、(少なくとも Python の世界では?) 広く使われている と考えた方がいいのかもしれません。Tim Peters 氏は、Python の 世界では結構な有名人のようですし。 以下は余談です。 > >ただ、Java を含む多くの GC つき言語では、参照の値 > >渡しをするわけで、この術語は使えませんね。 > ええと、少なくともJavaやCなら「値渡ししかない」で済み > そうな気がするのですけど。 もちろんそうです。 ただ、C++ でオブジェクトを参照渡しすることと、まあだいた い等価なことは、Java でも当然行なわれていることなわけで、 C++ と Java に関する話をするときに、これを意味する術語が 欲しいように思います。 で、これを "call by object" と呼びたくない派の人間として は、"call by object reference" のように呼びたくなるわけ です。 もっとも google によると "call by object reference" の 用例は230件しかないそうなので、こういう欲求は、非常に マイナーなのかもしれませんが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[396] Re:リバーシゲームのはさみ将棋への改造
投稿者:SFファン
2007/02/20 02:13:25

指摘のあったcppをインクルードするのをやめ、プレイヤーもBoardのポインタを持つ様にしたのですが、メモリリークを起こしてしまってます。 VC++はメソッドの静的コールをしようとすると怒られるので、メソッドを呼び出す場合、そのクラスのポインタをnewしてますが、それがマズイ様です。 クラスのポインタ変数を使用せずにこのプログラムを構築することは出来るのでしょうか。 ご回答の程よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[397] Re:リバーシゲームのはさみ将棋への改造
投稿者:(ぱ)
2007/02/20 02:13:25

>VC++はメソッドの静的コールをしようとすると怒られるので、 「静的コール」というのが何を指しているのかわかりませんが、 staticメソッド以外は、インスタンスがなければ呼び出すことはできないでしょう (Javaと同じです)。 >メソッドを呼び出す場合、そのクラスのポインタをnewしてますが、 >それがマズイ様です。 まず、「クラスのポインタ」が何を指すのか不明です。 Boardなりのクラスの「インスタンスのポインタ」の意味であるとすれば、 「メソッドを呼び出す場合、そのクラスのポインタをnewしてます」 というのは、私がこっちのページに書いた新人君の失敗と同じ失敗を しているように見えます。 http://kmaebashi.com/programmer/object/shigoto.html | そして、とある新人君は、(AWTの)Canvasに線を引きたい、という時、 | その場でCanvasをnewしてそのCanvasに線を引いてくれました。 | もちろんそのCanvasと、実際に画面に貼られているCanvasは違う | Canvasですから、画面に線は表示されず、彼は悩んでいたわけです。 | また別の新人君は、描画した図形を保持する「ShapeCollection」という | クラスについて、画面の再描画のため必要になったところでいきなりnewして | くれました。当然、新たに作り出されたShapeCollectionは空っぽなので、 | 画面には何も描画されませんでしたけど ※4。 手前味噌ですが、一度通して読んでみてはいかがでしょうか。 >クラスのポインタ変数を使用せずにこのプログラムを構築することは >出来るのでしょうか。 インスタンスへのポインタを使わずにこのプログラムを構築することは、 対戦用のBoardを静的に1個だけ持つようにして、先読み用のBoardを スタックに確保するようにすれば、不可能ではないでしょう。 でも、「対戦用のBoardを静的に1個だけ持つ」というのではせっかくの OO言語のメリットを捨てることになるので、あまりお勧めはしません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[399] Re:リバーシゲームのはさみ将棋への改造
投稿者:SFファン
2007/02/20 02:13:25

>「静的コール」というのが何を指しているのかわかりませんが、 「Board::move(~)」の様な呼び出しの事を指しています。名称は間違ってるかも知れません。 >まず、「クラスのポインタ」が何を指すのか不明です。 「Board* board = new Board()」の様にnewしたポインタ変数の事です。 「オブジェクトに仕事をさせる、ということ」を読ませて貰って、上記の様に一々ポインタ変数をnewせずにパラメータにポインタ変数を持たせて引き継がせればいい事が分かりました。 僕の憶測ですが、Javaのリバーシゲームでthisを多用していますが、これは特に使用しなくていいんですね。 現在、はさみ将棋プログラムに修正をかけていますが、まだまだメモリリークが起きている状態です。 指摘された修正をほぼ全て行なってメモリリークが起きるかどうかテストしたいと思います。 ご回答の程ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[401] Re:リバーシゲームのはさみ将棋への改造
投稿者:(ぱ)
2007/02/20 02:13:25

>>まず、「クラスのポインタ」が何を指すのか不明です。 >「Board* board = new Board()」の様にnewしたポインタ変数の事です。 クラスとインスタンスは別物なので、その違いは強く意識したほうがよいかと。 new Board()ではBoardクラスのインスタンスが生成(new)され、 「new Board()」という式はそのインスタンスへのポインタを返します。 上の「board」にはそれが代入されるわけですから、boardは、 インスタンスへのポインタであって、「クラスのポインタ」ではありません。 また、「newしたポインタ変数の事です」とのことですが、上の例にある ポインタ型の変数といえば「board」ですが、ここではboardがnewされている わけではありません。 細かいことを言うようですが、 「わかっている人が、厳密さを求められない局面で、適当に省略しながら話す」 のと、 「本当にわかってない」 のでは大違いですので一応念のため。 >僕の憶測ですが、Javaのリバーシゲームでthisを多用していますが、 >これは特に使用しなくていいんですね。 はい。インスタンスフィールドとローカル変数の区別をつけるため、 私はthis.をつけるようにしている、というだけです。 言語がthisを強制していてくれれば、こういう事故も起きないんですけどねえ。 http://d.hatena.ne.jp/higepon/20050329
[この投稿を含むスレッドを表示] [この投稿を削除]
[527] Re:リバーシゲームのはさみ将棋への改造
投稿者:SFファン
2007/02/20 02:13:25

ご無沙汰しています。 メモリリークの問題等を解決して何とかプロトタイプが出来ました。 まだ、 1)先手=人プレーヤー 後手=コンピュータプレイヤー オンリー 2)3手目以降人プレーヤーが打てない。 等の制限はありますが、コンピュータプレイヤーに打たせる事には成功しました。 コンピュータプレイヤーが打つ速度はJava版より速いです。 もっと改良を重ねて、最終的には本将棋ソフトを作成したいと考えています。 ソースを公開しますので、何かご意見があればお聞かせ下さい。 http://revolver.at.infoseek.co.jp/hasami-vc.lzh
[この投稿を含むスレッドを表示] [この投稿を削除]