Ошибка: требуется преобразование в нескалярный тип - PullRequest
12 голосов
/ 05 марта 2012

У меня небольшая проблема, связанная с неправильным размещением этой структуры. Вот код для структуры:

typedef struct stats {                  
    int strength;               
    int wisdom;                 
    int agility;                
} stats;

typedef struct inventory {
    int n_items;
    char **wepons;
    char **armor;
    char **potions;
    char **special;
} inventory;

typedef struct rooms {
    int n_monsters;
    int visited;
    struct rooms *nentry;
    struct rooms *sentry;
    struct rooms *wentry;
    struct rooms *eentry;
    struct monster *monsters;
} rooms;

typedef struct monster {
    int difficulty;
    char *name;
    char *type;
    int hp;
} monster;

typedef struct dungeon {
    char *name;
    int n_rooms;
    rooms *rm;
} dungeon;

typedef struct player {
    int maxhealth;
    int curhealth;
    int mana;
    char *class;
    char *condition;
    stats stats;
    rooms c_room;
} player;

typedef struct game_structure {
    player p1;
    dungeon d;
} game_structure;

А вот код, с которым у меня проблема:

dungeon d1 = (dungeon) malloc(sizeof(dungeon));

выдает ошибку "ошибка: запрошено преобразование в нескалярный тип" Может кто-нибудь помочь мне понять, почему это так?

Ответы [ 3 ]

14 голосов
/ 05 марта 2012

Вы не можете ничего привести к типу структуры.Я предполагаю, что вы хотели написать:

dungeon *d1 = (dungeon *)malloc(sizeof(dungeon));

Но, пожалуйста, не приводите возвращаемое значение malloc() в программе на Си.

dungeon *d1 = malloc(sizeof(dungeon));

Будет работать нормально ине будет скрывать #include ошибок от вас.

2 голосов
/ 05 марта 2012

malloc возвращает указатель, поэтому, вероятно, вам нужно следующее:

dungeon* d1 = malloc(sizeof(dungeon));

Вот как выглядит malloc:

void *malloc( size_t size );

Как вы видите, он возвращает void*, однако вы не должны приводить возвращаемое значение .

0 голосов
/ 05 марта 2012

Память, назначенная malloc, должна храниться в указателе на объект, а не в самом объекте:

dungeon *d1 = malloc(sizeof(dungeon));
...