2

C の学習に取り組むプロジェクトを思いついたのですが、ちょっとした壁にぶつかりました。このプロジェクトは、プレイヤーが 2 セットのカードを持っている単純なカード ゲームです。1 セットはセット サイズのデッキで、もう 1 セットは必要なだけ大きくできるカードのコレクションです。カードの構造は次のとおりです。

struct card {   
    char name[256];
    char special[256];
    char type[100];
    char rarity[100];
    int points;
};

次に、coll.txt というコレクションのファイルがあります。

first card goes here 50
second card goes here 70
...

次に、ファイルから読み取り、一時的なカードに保存する (ずさんな) 関数があります。

void read_into_collection(FILE *f) {
    char *file_text;
    char *token;
    int i;
    struct card temp;

    file_text = (char *) malloc(sizeof(struct card));

    while(fgets(file_text, sizeof(struct card), f)) {
        for(i = 1, token = strtok(file_text, " "); token; i++, token = strtok(NULL, " ")) {
            switch (i) {
            case 1:
                strcpy(temp.name, token);
                break;
            case 2:
                strcpy(temp.special, token);
                break;
            case 3:
                strcpy(temp.type, token);
                break;
            case 4:
                strcpy(temp.rarity, token);
                break;
            case 5:
                temp.points = atoi(token);
                break;
            default:

                i = 0;
                break;
            }
        }
    }


    free(file_text);
}

そのためi = 6、一時カードをコレクションに移動し、次のカードを一時変数に読み込む準備が整うまでに. しかし、どうすればこれを行うことができますか?コレクションが実際にどうあるべきかを理解するのに苦労しています。最初に私は考えました:

struct card *collection = (struct card *) malloc(number_of_cards * sizeof(struct card));

しかし、私が正しければ、malloc()メモリのチャンクへのポインタを返し、メモリは配列のように連続していないため、ポインタをインクリメントしてカードを保存することはできません。

また、ファイル内の行数 (各行はカード) を数えてから、そのサイズの配列を作成しようとしましたが、値が定数ではないというエラーが発生します。

これらのカードをコレクションとして保管する最良の方法は何ですか? コレクションを非常に大きな配列にするだけですが、この状況はプロジェクトで頻繁に発生するように感じ、簡単な方法を取るよりもむしろそれを処理する方法を学びたいと思います.

4

2 に答える 2

3

しかし、私が正しければ、 malloc() はメモリのチャンクへのポインタを返し、メモリは配列のようにシーケンシャルではないため、ポインタをインクリメントしてカードを格納することはできません。

間違い。シーケンシャルです。を使用して、任意malloc()の配列を作成できます。

mystruct* ptr = (mystruct*) malloc(sizeof(mystruct) * numberOfStructs)

for(int i = 0; i < numberOfStructs, i++) {
    ptr[i].setSomeInfo(x);
}

これは、C で行う標準的な方法です。

于 2012-06-13T17:34:20.580 に答える
1

私は C でプログラミングすることが多く、私のお気に入りの 1 つです。これが私の答えです。

malloc を使用した方法は配列を割り当てました

struct card *collection = (struct card *) malloc(number_of_cards * sizeof(struct card));

malloc を呼び出すたびに、メモリ内の異なる領域へのポインタが返されます。ただし、malloc を 1 回呼び出すと、常に連続したブロックが返されます。

カードの数がわかっている場合は、それを使用して配列を割り当て、次のようにアクセスできます

//added some code to prevent overflow
collection[i].name[255] = 0;
strncpy(collection[i] .name, token, 255);

カードの数がわからない場合はどうなりますか。次に、リンクされたリストを実行します。これは、サイズが不明なコレクションのコンテンツを格納する、リンクされたリストの主な用途です。

于 2012-06-13T17:42:32.583 に答える