MinGW でコンパイルする-O3 -Wall -c -fmessage-length=0 -std=c99
さて、これが問題だと思います...ここに内訳があります:
を使用して作成したリンクリストがあります
typedef struct Coordinate{
int x;
int y;
struct Coordinate *next;
} Coordinate;
6x6 ボード (マトリックス) に「有効な手」(リバーシ/オセロのゲーム) を追加しています。移動が有効かどうかをチェックする私のロジックは問題なく機能します。リストに何かを追加すると、問題が発生します。
明らかな理由から、重複する値をリストに追加することは避けたいと考えています。ただし、コーディングしようとするすべての関数 (動作するはずです) は、アプリケーションをクラッシュさせるだけで、長い一日中セグメンテーション違反が発生します。
だからここに私がコーディングしようとした関数があります:
int inList(Coordinate *list, int x, int y) {
if (list == NULL) return 0;
while (list != NULL) {
if (list->x == x && list->y == y) return 1;
else list = list->next;
}
return 0;
}
そしてそれを次のように呼び出しました:
Coordinate *validMoves = createNewCoordinate(-1, -1); // Just so that there is *something*
if (!inList(validMoves, 1, 1)) {
validMoves->next = createNewCoordinate(1, 1);
validMoves = validMoves->next;
}
私の知る限り、これは完全に機能するはずです。私はオンラインで例を調べましたが、この特定のプログラムでのポインターの非常に複雑な使用法はすべて、これまで問題なく機能していました。
とにかく、本当の問題は、重複が同じリスト(ポインターを介して接続されている)に入力されるのを防がなければ、無限ループが発生することです(これは、2つの要素が非ポインターであるため等しいと見なされることが原因だと思いますタイプは同じです)。
完全なリファレンスとして、コードの 3 つの部分すべてを Pastebin に投稿しました (心配する必要はありません。オープン ソースです!): othello.c othello_engine.c othello_engine.h
デバッグを試みましたが、あまり得意ではありません。言及する価値のあるものは何も見当たりませんでした。何が起こっているのかを説明したり、リンクされたリストで重複を回避する方法の例を挙げたりできますか? (私は私の脳が痛いほど多くの方法を試しました)
編集:後でリストをトラバースするとき(ゲームで複数の有効な「ターン」の後)に次の出力があるため、循環参照に陥っていることを知っています。
{1, 4} {3, 4} {1, 4} {3, 4} {1, 4} {3, 4}
theList = theList->next = theList
どうやって(疑似的に正しい) そこに入ったのか、私には手がかりがありません。おそらく私たちはマトリックスにいるのでしょう...