2015-08-04 4 views
0

Я думаю, что теперь этот вопрос получил множество ответов, но я все еще смущен, и я делаю странные вещи с указателями, поэтому я очень благодарен вам за помощь. Я хочу создать массив (неизвестный размер), который содержит связанные списки. Я думаю, что основными проблемами являются использование указателями в этом контексте. Пожалуйста, обратите внимание:C - Массив, содержащий связанные списки

int x_format; 
int y_format; 
typedef struct{ 
    int id; 
    struct item_node *next; 
    union{ 
     struct{ 
      int freq 
     } Sound; 
     struct{ 
      float reduce; 
     } Obstacle; 
    } data; 
}item_node; 
item_node *buffer; 
item_node **room; 
item_node **room_new; 

void createRoom(int x, int y) 
{ 
    buffer = malloc(sizeof(item_node)*x*y); 
    room = malloc(sizeof(item_node *)*y); 
    for(int i = 0; i<y; i++) 
    room[i] = &buffer[i*x]; 
    for(int j = 0; j<x; ++j) 
    { 
     for(int k = 0; k<y; ++k) 
     { 
      room[j][k].next = NULL; 
     } 
    } 
} 
item_node createItem (int x, int y, int id) 
{ 
    item_node selected = room[x][y]; 
    //Error 
    if(selected == NULL) 
     selected = malloc(sizeof(item_node)); 
    else{ 
     while(selected->next != NULL) 
      selected = selected->next; 

     selected->next = malloc(sizeof(item_node)); 
     selected = selected->next; 
    } 

    selected->id = id; 
    selected->next = NULL; 
    return selected; 
} 
int main (int argc, char *argv[]) 
{ 
    x_format = 100; 
    y_format = 100; 

    createRoom(x_format,y_format); 
    item_node itemtest = createItem(1,1,0); 
    free(room); 
    free(buffer); 
} 

Таким образом, проблема, которая возникает в:

error: invalid operands to binary expression ('item_node' and 'void *') if(selected == NULL) 

Я понимаю ошибку, но я сейчас не как исправить это. Извините, если этот вопрос - путь к тривиальному, и я ценю любую помощь! Спасибо.

+0

Тип 'selected' не указатель. BTW 'typedef struct {' shuould be 'typedef struct item_node {' – BLUEPIXY

ответ

1

Я уверен, что ваш item_node тип данных не указатель, а структура. Однако в выделенной строке вы сравниваете экземпляр такой структуры с указателем void (и позже делаете другое), что является ошибкой. По-видимому, следующий предназначался:

1) item_node* createItem (int x, int y, int id)

2) item_node* selected = room[x][y];

+0

Спасибо вам большое за вашу помощь! Помогли! – Julius

2

На тему, проблема здесь:

item_node createItem (int x, int y, int id){ 
    item_node selected = room[x][y]; 
    //Error 
    if(selected == NULL) 
     selected = malloc(sizeof(item_node)); 

В вашем случае item_node выбрана переменная, не указатель. Вы объявили выбранным как переменную item_node, которая является структурой. Здесь нет указателей. Затем вы сравниваете переменную определенного типа с NULL (которая определена как (void *) 0 в простой C).

Отключить тему: Вся программа кажется ошибочной с первого взгляда. Пожалуйста, пересмотреть алгоритм и структуры данных, мне кажется, что вы смешиваете указатели и немного массируете свободно.

+0

Спасибо, да, вы правы. Я новичок в C, но я думаю, что иногда вам просто нужно что-то попробовать, и это здорово увидеть, что талантливые люди готовы помочь :) – Julius

Смежные вопросы