0

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どうやって(疑似的に正しい) そこに入ったのか、私には手がかりがありません。おそらく私たちはマトリックスにいるのでしょう...

4

3 に答える 3

1

データの重複をチェックする別の方法を考えられるように、データ範囲を尋ねました。メモリが制限されていない場合。次のようなことができます。これは、重複データ値をチェックするためのロジックの種類です。インデックスと値が同じで、カウントフィールドがあるデータ値の単純なルックアップテーブルがあります。カウント フィールドがゼロの場合は、一意の値が入る可能性があることを意味します。データを削除するときは、カウントを引きます。このようにして、カウントを追跡し、値の一意性を確保します。これは配列であるため、トラバースする必要もありません。この管理のために、いくつかの追加コードを実装する必要があります。でも、うまく設計すればできるはずです。

ここに画像の説明を入力

于 2013-09-26T08:31:45.053 に答える