1

私は他の質問を見てきましたが、これに対する明確な答えを見つけることができないようです. 構造体内で構造体配列を宣言するにはどうすればよいですか? main() で実行しようとしましたが、正しく実行しているかどうかわかりません。「初期化により、キャストなしでポインターから整数が作成されます」という警告が表示され続けます。

#define MAXCARDS 20     

struct card {
    int priority;       
};

struct battleQ {
    struct card cards[MAXCARDS];
    int head;
    int tail;
    int size;
};

int main (int argc, char *argv[]) {
    struct battleQ bq;
    bq.cards = {
                      malloc(MAXCARDS * sizeof (struct card)), //Trouble with this part
                      0,
                      0,
                      0
                };

        //...

    return 1;
}

提案後に編集: さて、問題が発生しました。このエラーが発生し続けます:

3 [main] TurnBasedSystem 47792 open_stackdumpfile: Dumping stack trace to TurnBasedSystem.exe.stackdump

コードを少し変更して、すべてをポインターにする必要がありました。私はそれをテストしましたが、次のような属性のいずれかを割り当てようとするとすぐにエラーが発生します: bq->head = 0

全体として、キューにカードを追加するだけです。修正されたコードは次のとおりです。

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

#define MAXCARDS 20

struct card {
    int priority;       
};

// A queue defined by a circular array
struct battleQ {
    struct card *cards[MAXCARDS];
    int head;
    int tail;
    int size;
};

bool battleQEnqueue (struct battleQ *bq, struct card *c);
bool battleQisFull(struct battleQ *bq);

// Method for enqueuing a card to the queue
bool battleQEnqueue (struct battleQ *bq, struct card *c) {
    bool success = false;
    if (battleQisFull(&bq)) {
        printf("Error: Battle queue is full\n");
    } else {
        success = true;
        bq->cards[bq->tail] = c;
        bq->size = bq->size + 1;
        bq->tail = (bq->tail + 1) % MAXCARDS;
    }
    return success;
}

int main (int argc, char *argv[]) {
    int i;
    struct battleQ *bq;
    memset(&bq, 0, sizeof(bq));  // Did I do this properly?
    bq->tail = 0;               // Gives error at this point
    bq->head = 0;               
    bq->size = 0;

    // This is where I create a card and add it to the queue but the main problem
    // is still the initialization above
    for (i = 0; i < 5; i++) {
        struct card *c = malloc(sizeof(c));
        c->priority = i + 10;
        printf("%d,", c->priority);
        battleQEnqueue(&bq, &c);
    }

    return 1;
}
4

3 に答える 3

3

bq.cardsは構造体の配列です。その必要はありませんmalloc。配列全体を次のように初期化できます。

memset(bq.cards, 0, sizeof(bq.cards));

初期化したい場合bq

    memset(&bq, 0, sizeof(bq));
于 2013-06-23T08:09:51.130 に答える