K.Maebashi's BBS

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

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

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

[1717] Re:構造体へのポインタを返す関数
投稿者:yuya
2011/03/21 18:35:08

にゃるほどー。 コンパイラは宣言がダブってる(re-declared)ことに怒ってるんじゃなくて、 型が合わない(conflicting types)から怒ってるんですね。 >static KOUZOU3 *func();の行だけエラーです。 さすがにデータ構造がたまたま同じでも、別の構造体だとダメか(笑)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1716] Re:構造体へのポインタを返す関数
投稿者:ti
2011/03/21 18:16:48

tiです。 >矛盾しない関数宣言は何回行ってもよい(正しいプログラムである)ので、 >この2行があってもエラーにはならない。 >過去に書かれたソースコードとの互換性を維持するために、このコードに対して >警告は出ないのが大多数のコンパイラの挙動だろうね。 ># 俺的には、出たらびっくり。 どうもそうみたいでびっくりです(VC++ 2008で確認)。 実例です。 typedef struct { int val; } KOUZOU1,KOUZOU2; typedef struct { int val; } KOUZOU3; static KOUZOU1 *func(); static KOUZOU2 *func(); static KOUZOU3 *func(); int main(void) { return 0; } static KOUZOU3 *func();の行だけエラーです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1715] Re:構造体へのポインタを返す関数
投稿者:774RR
2011/03/21 15:56:46

512 氏の [1706] 発言に一言付け加えると理解しやすくなるだろう。 > 構造体ではなくintへのポインタであればエラーは出ません。 「両方を」を追加。 すると main.c 中には static int *func(); // File1.h 由来 static int *func(); // File2.h 由来 と書かれた2行が入ることになる。 矛盾しない関数宣言は何回行ってもよい(正しいプログラムである)ので、 この2行があってもエラーにはならない。 過去に書かれたソースコードとの互換性を維持するために、このコードに対して 警告は出ないのが大多数のコンパイラの挙動だろうね。 # 俺的には、出たらびっくり。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1714] Re:構造体へのポインタを返す関数
投稿者:mano
2011/03/21 12:17:05

[1706]の > 構造体ではなくintへのポインタであればエラーは出ません。 は、どう?エラーじゃなくても警告ぐらい出す気がするんだけど、 こちら、Cが詳しくないのでよく分りません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1713] Re:構造体へのポインタを返す関数
投稿者:(ぱ)こと管理人
2011/03/21 08:01:42

既に回答がついていますが、File1.hとFile2.hの static KOUZOU1 *func(); static KOUZOU2 *func(); このふたつのプロトタイプ宣言が、main.cの中で両方とも見えてしまって いるのが原因です。 「static KOUZOU1 *func()」という関数を、File1.cの中だけで使うのであれば、 .hファイルではなくFile1.cの中で宣言すればOKです。 関数定義自体を、それを呼び出すところよりも先に書けるのであればそれでも OKです(私はこちらの書き方の方が好みです)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1712] Re:構造体へのポインタを返す関数
投稿者:774RR
2011/03/21 07:07:27

正解っす。あえてフォローするなら ti 氏が解説を省略したところを。 C のプリプロセッサは単純置換を行う機能であるため、 #include "hogehoge.h" は この行が hogehoge.h の中身に置き換わるだけ である、ということを意識すると理解が早い。 main.c は File1.h と File2.h を両方取り込む 取り込んだ結果のファイルを翻訳単位という main.c 中に static KOUZOU1* func(); と static KOUZOU2* func(); が両方入る 同一関数名が違う機能であると宣言されているのでエラー。 gcc -E hoge.c とか gcc -E -C hoge.c とかしてみると参考になるかもしれない。 次のステップへのヒントを 複数人開発をするようになると、重要度は .h ファイル> .c ファイル になる。 .h ファイルには「他人に使ってもらうため」の宣言・コメントを書く .c ファイルにはその実装を書く だから、 ・他人に使ってもらいたくない static 変数や関数は .h に書かずに .c に書く ・inline 展開される前提の短い static 関数は .h に書くことがある
[この投稿を含むスレッドを表示] [この投稿を削除]
[1711] Re:構造体へのポインタを返す関数
投稿者:ti
2011/03/21 02:28:24

tiと申します。 自分の勉強のため回答させていただきますので、 前橋さん間違いや補足のご指摘お願いします。 main.cの中で >#include "File1.h" >#include "File2.h" となっていて、 >static KOUZOU1 *func(); >static KOUZOU2 *func(); /* ここがエラーになります:error: conflicting types for 'func' */ で 展開後にfunc識別子が重複していることが原因です。 どちらかと関係するところを変えればコンパイルできるはずです。 なお、static宣言はmain.cなど、公開したくないソースに対してのヘッダファイルに 含めるべきでないと思います。 公開用(extern宣言の関数)と非公開用(ある関数だけで使うstatic宣言の関数)で ヘッダファイルは分けるべきです。 また、ヘッダファイルは二重展開防止機能をつけておきましょう。 #ifndef FILE1_H #define FILE1_H ~ #endif 以上 >お返事遅れました。 >(ぱ)さん、yuyaさん、ありがとうございます。 >(ぱ)さんの回答にひもづけて続けます。 > >下記がサンプルコードとエラーメッセージです。 >(環境はMac OSXのXcode3.2.4です。) > >main.c >-------------------------------------------------- >#include "File1.h" >#include "File2.h" > >int main (int argc, const char * argv[]) { > > file1(); > file2(); > > return 0; >} >-------------------------------------------------- > >File1.h >-------------------------------------------------- >typedef struct KOUZOU1_tag { > int var; >} KOUZOU1; > >void file1(); >static KOUZOU1 *func(); >-------------------------------------------------- > >File1.c >-------------------------------------------------- >#include <stdio.h> >#include <stdlib.h> >#include "File1.h" > >void file1() { > KOUZOU1 *kouzou; > kouzou = func(); > > printf("%d\n", kouzou->var); >} > >static KOUZOU1 *func() { > KOUZOU1 *kouzou; > > kouzou = malloc(sizeof(KOUZOU1)); > kouzou->var = 1; > > return kouzou; >} >-------------------------------------------------- > >File2.h >-------------------------------------------------- >typedef struct KOUZOU2_tag { > int var; >} KOUZOU2; > >void file2(); >static KOUZOU2 *func(); /* ここがエラーになります:error: conflicting types for 'func' */ >-------------------------------------------------- > >File2.c >-------------------------------------------------- >#include <stdio.h> >#include <stdlib.h> >#include "File2.h" > >void file2() { > KOUZOU2 *kouzou; > kouzou = func(); > > printf("%d\n", kouzou->var); >} > >static KOUZOU2 *func() { > KOUZOU2 *kouzou; > > kouzou = malloc(sizeof(KOUZOU2)); > kouzou->var = 2; > > return kouzou; >} >-------------------------------------------------- > >エラーは >error: conflicting types for 'func' >というもので >File2.h の static KOUZOU2 *func(); >の所に出ます。 > >ちなみに >error: previous declaration of 'func' was here >というメッセージも同時に出て、開くと >File1.h の static KOUZOU1 *func(); >を指していました。 > >やっぱりstaticを付けているのに >「funcさっき宣言したじゃん!」と言われているようなんですが、 >いかがでしょうか。 > >うーん、どこを勘違いしてるんだろうか。。。 > >よろしくお願いします! > >P.S. >「記憶クラス指定子」「型修飾子」の違いなど、 >自分で間違えて指摘されるとスムーズに理解しやすいですね。 >本で読むときはつい飛ばしてしまいがちですが(笑
[この投稿を含むスレッドを表示] [この投稿を削除]
[1710] Re:構造体へのポインタを返す関数
投稿者:512
2011/03/20 17:26:03

お返事遅れました。 (ぱ)さん、yuyaさん、ありがとうございます。 (ぱ)さんの回答にひもづけて続けます。 下記がサンプルコードとエラーメッセージです。 (環境はMac OSXのXcode3.2.4です。) main.c -------------------------------------------------- #include "File1.h" #include "File2.h" int main (int argc, const char * argv[]) { file1(); file2(); return 0; } -------------------------------------------------- File1.h -------------------------------------------------- typedef struct KOUZOU1_tag { int var; } KOUZOU1; void file1(); static KOUZOU1 *func(); -------------------------------------------------- File1.c -------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include "File1.h" void file1() { KOUZOU1 *kouzou; kouzou = func(); printf("%d\n", kouzou->var); } static KOUZOU1 *func() { KOUZOU1 *kouzou; kouzou = malloc(sizeof(KOUZOU1)); kouzou->var = 1; return kouzou; } -------------------------------------------------- File2.h -------------------------------------------------- typedef struct KOUZOU2_tag { int var; } KOUZOU2; void file2(); static KOUZOU2 *func(); /* ここがエラーになります:error: conflicting types for 'func' */ -------------------------------------------------- File2.c -------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include "File2.h" void file2() { KOUZOU2 *kouzou; kouzou = func(); printf("%d\n", kouzou->var); } static KOUZOU2 *func() { KOUZOU2 *kouzou; kouzou = malloc(sizeof(KOUZOU2)); kouzou->var = 2; return kouzou; } -------------------------------------------------- エラーは error: conflicting types for 'func' というもので File2.h の static KOUZOU2 *func(); の所に出ます。 ちなみに error: previous declaration of 'func' was here というメッセージも同時に出て、開くと File1.h の static KOUZOU1 *func(); を指していました。 やっぱりstaticを付けているのに 「funcさっき宣言したじゃん!」と言われているようなんですが、 いかがでしょうか。 うーん、どこを勘違いしてるんだろうか。。。 よろしくお願いします! P.S. 「記憶クラス指定子」「型修飾子」の違いなど、 自分で間違えて指摘されるとスムーズに理解しやすいですね。 本で読むときはつい飛ばしてしまいがちですが(笑
[この投稿を含むスレッドを表示] [この投稿を削除]
[1709] Re:構造体へのポインタを返す関数
投稿者:yuya
2011/03/18 11:07:40

どーでもいい私の感想ですが、 >もちろん関数の名前を変えれば解決するのですが、 >せっかくCを勉強しているので、原因をはっきりさせたいです。 これに惚れますね(笑)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1708] Re:構造体へのポインタを返す関数
投稿者:yuya
2011/03/18 10:46:38

(ぱ)さんのおっしゃる通りで、エラーメッセージ(とサンプルコード)をコピペしたものを見ないと原因は分かりませんが、 >staticが"func"にかかっていないのかな? >という気がしますが、どうなんでしょうか。 このような疑問が湧くということは、 static, extern のような「記憶クラス指定子」と、 constのような「型修飾子」を混同なさっているのではないかと思います。 static が宣言中のどこにあるかによって、宣言の意味が変わることはありません。 先頭以外に書いた場合には、先頭に書いたのと同じ意味になるか、文法エラーになるか、のどちらかです。 ……って言い切っちゃったけど自信ない(^^;)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1707] Re:構造体へのポインタを返す関数
投稿者:(ぱ)こと管理人
2011/03/18 03:34:38

はじめまして。 >最近C言語をがんばって勉強しています。(もちろん楽しいです) >ポインタ完全制覇には大変お世話になりました。 ありがとうございます。 で、ご質問の件ですが、 >現在、ソースファイルを分けてプログラムを書いており、 >他のファイルからアクセスしない関数にはstaticをつけています。 >なので、複数ファイル上で同名の関数を持っていても >エラーは出ません。 > >しかし、構造体へのポインタを返す関数の場合は、 >staticを付けてもエラーになってしまいます。 さすがにこれはありえないと思います。 戻り値の型が構造体へのポインタであっても、文法上、staticで名前を隠蔽することに 関係はしませんし、処理系のバグにしてもあまりにも変に見えます。 具体的にどのようなエラーが出ているのか、エラーメッセージを教えてもらえますか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1706] 構造体へのポインタを返す関数
投稿者:512
2011/03/17 22:11:51

はじめまして! 最近C言語をがんばって勉強しています。(もちろん楽しいです) ポインタ完全制覇には大変お世話になりました。 未だに完全消化できておらず、 この本を消化できれば分かることなのかもしれませんが、 身近に頼れる人がいなく、質問させてください! 現在、ソースファイルを分けてプログラムを書いており、 他のファイルからアクセスしない関数にはstaticをつけています。 なので、複数ファイル上で同名の関数を持っていても エラーは出ません。 しかし、構造体へのポインタを返す関数の場合は、 staticを付けてもエラーになってしまいます。 構造体ではなくintへのポインタであればエラーは出ません。 構造体はそれぞれ別のものです。 もちろん関数の名前を変えれば解決するのですが、 せっかくCを勉強しているので、原因をはっきりさせたいです。 具体的には ファイル1に static KOUZOU1 *func(); ファイル2に static KOUZOU2 *func(); を置いています。 ポインタ完全制覇読者としては staticが"func"にかかっていないのかな? という気がしますが、どうなんでしょうか。 お知恵を拝借できれば幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1704] Re:オセロについて
投稿者:学生
2011/02/19 22:26:47

> >Board.javaのput()メソッドの中のwindow.redraw()を抜けばよいようです。 > >このメソッドは、最終的にはCanvasのrepaint()を呼び出すことで、オセロの >盤面の再描画を行います。石を置いた後、アニメーションとともに画面の更新は >終わっているのですが、「念のために」全体の再描画をかけているわけです。 > >しかし、AWTにおけるrepaint()は非同期なので、即座に実行されるとは限りません。 >この再描画要求が、「次に石を置き、盤面の状態は変わったが、アニメーションの前」 >という状況で実行されると、アニメーション前に盤面の絵が更新されてしまいます。 > >ソースは近日中に差し替えます。ご指摘ありがとうございました。 お忙しい中、ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1703] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/02/14 02:17:25

大変遅くなってしまいましてすみません。学生さんがまだここを見ているかどうかも わかりませんが… >>石がひっくり返るアニメーションの前に、既にBoard内のデータは >>書き換えられているので、もしその前に画面の再描画が動いてしまえば >>現状のような現象になると思うのですが、すみませんが最近どたばたしていて >>私のほうでは原因が追えていません。 > >自分の方で調べて直してみたのですができませんでした。 > >今、お忙しそうですが原因がわかったらでいいので教えてもらえるとありがたいです。 Board.javaのput()メソッドの中のwindow.redraw()を抜けばよいようです。 このメソッドは、最終的にはCanvasのrepaint()を呼び出すことで、オセロの 盤面の再描画を行います。石を置いた後、アニメーションとともに画面の更新は 終わっているのですが、「念のために」全体の再描画をかけているわけです。 しかし、AWTにおけるrepaint()は非同期なので、即座に実行されるとは限りません。 この再描画要求が、「次に石を置き、盤面の状態は変わったが、アニメーションの前」 という状況で実行されると、アニメーション前に盤面の絵が更新されてしまいます。 ソースは近日中に差し替えます。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1702] またまた、おひさしぶりです
投稿者:
2011/02/09 00:03:24

またまた、お久しぶりです。 最近は、主に3Dグラフィック関係の組込関数ばかり作っています。 言語部分の修正はあまり無いです。しかし、組み込み関数及び、 普通の関数のほとんどがリターンコード0のばかりだったので、void型を 作りました。関数の戻り値だけにしか使い道がありませんが。  その結果、バイトコードでは、call後のpopが必要なくなったのと、call機能 の実装部分が、void関数ではリターンコード処理がない分シンプルになりました。  おお、今気がついた、voidの関数はcall_voidの様な命令追加して、より シンプルにしよう。ほとんどがvoid関数なので効果が出る。  また、関数コールを数倍速する方法。それは、初期値の定数処理バイト コードが不要になり、パラメータ処理も単純になります。しかし、修正部分が 多いのでまた今度にします。  方法は簡単で、関数コールのスタック情報を事前に総て持っていて、 それをスタックにコピーして、インデックスアドレスとパラメータデータ のみ調整することで高速に関数が呼べます。定数コピーとかパラメータ 領域作成等細かな処理を一発コピーで終わらせます。  いまはまだ出来ませんが、行く行く組込みます。  また、シート変数を普通の関数パラメータに指定できるようにするため、 バイトコードが7つも増えてしまいました。orz  はやく、こんなことがしたかったんですと見せられるといいのですが、 まだまだ先が遠いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1701] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/02/08 02:57:17

>今、お忙しそうですが原因がわかったらでいいので教えてもらえるとありがたいです。 すみません、ちょっと手間取ってます…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1700] Re:オセロについて
投稿者:学生
2011/02/03 21:52:07

> >石がひっくり返るアニメーションの前に、既にBoard内のデータは >書き換えられているので、もしその前に画面の再描画が動いてしまえば >現状のような現象になると思うのですが、すみませんが最近どたばたしていて >私のほうでは原因が追えていません。 自分の方で調べて直してみたのですができませんでした。 今、お忙しそうですが原因がわかったらでいいので教えてもらえるとありがたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1699] Re:「ほげ」について
投稿者:(ぱ)こと管理人
2011/02/02 03:30:05

はじめまして。時間がないので簡単な変身となってしまいますが、 >私のうっすらとした記憶では「Dr.スランプ」で使用されていたのではないかと >思うのですが(ソースが見つけられず、正確な情報でなくて申し訳ございません)。 Dr.スランプ、実家に帰れば文庫版を持っているのですが… >P.S.「ぴよ」といえば、「Dr.スランプ」より「めぞん一刻」や「タッチ」あたりのエプロン、シャツの柄でよく目にする「模様に困ったらpiyo」的なイメージが強いですが・・・これも今書き込もうとしてふと思っただけなので正確な情報でなくてすみません。 で、「ぴよ」のほうですが、こちらは「ほげ」と違い発祥が(たぶん)わかっています。 http://togetter.com/li/47113 やはり響子さんのエプロンが元ネタとのこと。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1698] 「ほげ」について
投稿者:通りすがりのD
2011/02/01 13:26:01

はじめまして。言語のお勉強をしていたはずが、「ほげ」にはまってしまいました(笑) 私のうっすらとした記憶では「Dr.スランプ」で使用されていたのではないかと思うのですが(ソースが見つけられず、正確な情報でなくて申し訳ございません)。 ちょうど80年代前半(1979~1984)あたりですし、全国的に広まった理由としてもまぁ納得かなぁ・・・なんて。 (まぁ、流行とコードなどの命名をいっしょにはできないでしょうが) あられちゃんの「ほよよ」などはメジャーですが、爆発に巻き込まれた後や眠いのを起こされたような場面で使用されているイメージがあります。 http://www.studiohs.com/28if/text/slump/whoswho/ka_ko.html の「暗悪健太」に > スーパーほげげスペシャルをやっていたりする。 や、 http://blog.livedoor.jp/comic2ch/archives/80579.html >213 >羽の生えたでかい猿に喰われそうになってほげげーっとか悲鳴あげてるのにワロタw とありました。 もし、機会があればご確認下さい。 P.S.「ぴよ」といえば、「Dr.スランプ」より「めぞん一刻」や「タッチ」あたりのエプロン、シャツの柄でよく目にする「模様に困ったらpiyo」的なイメージが強いですが・・・これも今書き込もうとしてふと思っただけなので正確な情報でなくてすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1696] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/02/01 02:55:43

>これは、どこを直せばよろしいのですか? 前回書いたとおりJudge.javaがGUIのイベントドリブンなスレッドとは 別スレッドで動いていて、石をひっくり返すところは、Judge.javaの方の スレッドで、Board.javaのput()から呼び出されています (window.animationPut()メソッド)。 石がひっくり返るアニメーションの前に、既にBoard内のデータは 書き換えられているので、もしその前に画面の再描画が動いてしまえば 現状のような現象になると思うのですが、すみませんが最近どたばたしていて 私のほうでは原因が追えていません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1695] Re:オセロについて
投稿者:学生
2011/01/30 19:02:26

>>いや、確かに表示がおかしくなってますね。 >>実際にコンピュータ同士対戦させてみて、最後のほうの石の表示を観察してみてください。 >>結果的な盤面変化は問題ないのですが、ひっくり返る過程の表示だけ変です。 > >再確認しました。思い込みとは恐ろしいもので、たくさんの石を一気に >ひっくり返すとき、ひっくり返す前から色が変わっているにもかかわらず >気付いていませんでした。失礼しました > 学生さん > >このプログラムは、ゲームのメインループ(先手後手を切り替えながら >ゲームオーバーまでぐるぐる処理)を普通のループで書きたかったため、 >イベントドリブンであるGUIとは別のスレッドで動かしています。 >その待ち合わせがうまくいっていなくて、アニメーション前に盤面が >再描画されているように思います。 > >何年も前に公開したプログラムなのでいまさらなのですが、ちょっと確認してみます。 > これは、どこを直せばよろしいのですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1694] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/30 14:33:42

>>このプログラムは、ゲームのメインループ(先手後手を切り替えながら >>ゲームオーバーまでぐるぐる処理)を普通のループで書きたかったため、 >>イベントドリブンであるGUIとは別のスレッドで動かしています。 >>その待ち合わせがうまくいっていなくて、アニメーション前に盤面が >>再描画されているように思います。 > >この処理は、どこでやっているんですか? ゲームオーバーまでぐるぐる回る処理のことであれば、 Judge.javaでやっています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1693] Re:オセロについて
投稿者:学生
2011/01/27 22:18:57

>このプログラムは、ゲームのメインループ(先手後手を切り替えながら >ゲームオーバーまでぐるぐる処理)を普通のループで書きたかったため、 >イベントドリブンであるGUIとは別のスレッドで動かしています。 >その待ち合わせがうまくいっていなくて、アニメーション前に盤面が >再描画されているように思います。 この処理は、どこでやっているんですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1692] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/23 16:51:12

>いや、確かに表示がおかしくなってますね。 >実際にコンピュータ同士対戦させてみて、最後のほうの石の表示を観察してみてください。 >結果的な盤面変化は問題ないのですが、ひっくり返る過程の表示だけ変です。 再確認しました。思い込みとは恐ろしいもので、たくさんの石を一気に ひっくり返すとき、ひっくり返す前から色が変わっているにもかかわらず 気付いていませんでした。失礼しました > 学生さん このプログラムは、ゲームのメインループ(先手後手を切り替えながら ゲームオーバーまでぐるぐる処理)を普通のループで書きたかったため、 イベントドリブンであるGUIとは別のスレッドで動かしています。 その待ち合わせがうまくいっていなくて、アニメーション前に盤面が 再描画されているように思います。 何年も前に公開したプログラムなのでいまさらなのですが、ちょっと確認してみます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1691] Re:オセロについて
投稿者:yuya
2011/01/23 16:01:32

>この説明ではなんだかよくわかりませんが、たぶん自動でパスしてるんじゃ >ないでしょうか? このプログラムでは、打つところがないときは勝手にパスします。 > いや、確かに表示がおかしくなってますね。 実際にコンピュータ同士対戦させてみて、最後のほうの石の表示を観察してみてください。 結果的な盤面変化は問題ないのですが、ひっくり返る過程の表示だけ変です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1690] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/22 23:15:09

>たとえば、黒を置いた時に白から黒にひっくり返るのですが >最後のほうになると黒を置いた時に石が黒に代わってから白から黒に回って変化して >いるんですけどそれはなんで最後のほうだけなるんでしょうか? この説明ではなんだかよくわかりませんが、たぶん自動でパスしてるんじゃ ないでしょうか? このプログラムでは、打つところがないときは勝手にパスします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1689] Re:オセロについて
投稿者:学生
2011/01/22 22:45:58

>こちらのサンプルアプレットでのオセロゲームで >石がひっくり返るときに > >たとえば、黒を置いた時に白から黒にひっくり返るのですが >最後のほうになると黒を置いた時に石が黒に代わってから白から黒に回って変化して >いるんですけどそれはなんで最後のほうだけなるんでしょうか? 前の質問ですけど コンピュータの時だけなってしまいます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1688] Re:オセロについて
投稿者:学生
2011/01/22 22:29:49

アドバイスのおかげでコンピュータが作成できました。 ありがとうございます。 こちらのサンプルアプレットでのオセロゲームで 石がひっくり返るときに たとえば、黒を置いた時に白から黒にひっくり返るのですが 最後のほうになると黒を置いた時に石が黒に代わってから白から黒に回って変化して いるんですけどそれはなんで最後のほうだけなるんでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1687] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/21 00:50:07

>次にミニマック法を作成してみたいと思うのですが >ComputerPlayer.javaでは何手先まで読んでいて、どこでやっているんでしょうか? ComputerPlayer.javaはほぼ全域がミニマックス法とαβ枝刈りなので 「どこで」というのはないのですが、先読みの深さについては以下のように なっています。 ・通常は4手先までです(DEFAULT_SEARCH_DEPTH)。 ・残りのマスの数を数えます。これが残りの手数の概算(パスを考慮しない)と  なるのですが、これが5(WIN_SEARCH_DEPTH)以下になったら、  完全読み切りモードに入ります。 >後、ab法はどこでやっているのですか? 変数alphaBetaValueで処理を分けているあたりです。 今ソースを見ると、残手数がPERFECT_SEARCH_DEPTH以下のときと WIN_SEARCH_DEPTH以下のときとでなにやら分岐していますが、 ここで設定した変数は使っていないので、無視してください。すみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1686] Re:オセロについて
投稿者:学生
2011/01/20 22:05:39

基本値の計算が作成できました。 次にミニマック法を作成してみたいと思うのですが ComputerPlayer.javaでは何手先まで読んでいて、どこでやっているんでしょうか? 後、ab法はどこでやっているのですか?
[この投稿を含むスレッドを表示] [この投稿を削除]