2013-06-19 3 views
0

Я пытаюсь добавить структуру в массив структур, однако я получаю сообщение об ошибке: Parse Issue: Expected expression. Ниже мой код:C Struct Assigning Struct Array

main.c:

#include <stdio.h> 

#include "map.h" 

int main(int argc, const char * argv[]) { 
    map(map_ss, char*, char*); 

    map_init(map_ss, map); 

    printf("Map has been initilized\n\n"); 

    // The error is over the next 3 lines 
    add_pair(map, "first", "1"); 
    add_pair(map, "second", "2"); 
    add_pair(map, "third", "3"); 

    print_map(map); 

    map_free(map); 

    printf("\n\nMap has been freed."); 

    return 0; 
} 

и map.h

#ifndef Data_Structures_map_h 
#define Data_Structures_map_h 

#include <stdio.h> 
#include <stdlib.h> 

#define pair(key_t, value_t)            \ 
    typedef struct pair {             \ 
     key_t key;               \ 
     value_t value;              \ 
    } pair 

#define map(name, key_t, value_t)           \ 
    pair(key_t, value_t);             \ 
    typedef struct name {             \ 
     pair* pairs;              \ 
     int capacity;              \ 
     int size;               \ 
    } name 

#define map_init(name, var_name)           \ 
    name* var_name = malloc(sizeof(var_name));        \ 
    var_name->pairs = malloc(10 * sizeof(var_name->pairs));     \ 
    var_name->capacity = 10;            \ 
    var_name->size = 0 

#define map_free(var_name)             \ 
    free(var_name) 

#define add_pair(var_name, key, value)          \ 
    if (var_name->size == var_name->capacity)        \ 
     var_name->pairs = realloc(var_name->pairs, 2 * var_name->capacity); \ 
    var_name->pairs[var_name->size++] = { .key = key, .value = value; }  \ // error in here 

#define print_map(var_name)             \ 
    printf("Contents of the map:\n");          \ 
    int i;                 \ 
    for (i = 0; i < var_name->size; i++) {         \ 
     printf("Item #%i: Key:%p -> Value:%p\n",       \ 
      (i+1), var_name->pairs[i].key, var_name->pairs[i].value);  \ 
    }                  \ 

#endif /* Data_Structures_map_h */ 

Я пытался, var_name->pairs[var_name->size++] = { key, value; } и pair p; p.key = key; p.value = value; var_name->pairs[var_name->size++] = p;, но до сих пор не работает. В чем проблема, похоже, она должна работать.

Кроме того, есть ли местозаполнитель, который напишет что-нибудь в нем, я прочитал в Википедии, что %p для void*, так что я мог бы работать.

Я использую Xcode на Mac.

+0

ужасный, ужасный, использование макросов. – unwind

+0

'pair p; p.key = ключ; p.value = значение; var_name-> pairs [var_name-> size ++] = p ;, но все равно не работает. В чем проблема здесь? Имя аргумента макроса дублируется (с элементом структуры). – BLUEPIXY

ответ

0

попробовать этот

#define add_pair(var_name, _key, _value)         \ 
    if (var_name->size == var_name->capacity)        \ 
     var_name->pairs = realloc(var_name->pairs, 2 * var_name->capacity); \ 
    var_name->pairs[var_name->size].key = _key;        \ 
    var_name->pairs[var_name->size++].value = _value 
+0

note: wrong do free – BLUEPIXY

+0

Это сработало, но почему я должен был перейти от 'key' к' _key 'и от' value' до '_value'? –

+1

@ aizen92 Имя члена и аргумент макроса - это дубликат. Например. 'pair p; p.key = key; 'macro expand - >>' pair p; p. "key" = "key"; ' – BLUEPIXY

0

Если это не просто проблема форматирования, похоже, что у вас есть точка с запятой на неправильной стороне фигурной скобки в { .key = key, .value = value; }.

Должно быть { .key = key, .value = value };.

+0

Yeh, полу-двоеточие было неуместным, но даже без него, или после '{' Я все равно получаю ту же ошибку –

0

У вас не может быть анонимных выражений инициализатора структуры, как компилятор должен знать, какой тип имеет?

Предполагая, что вы используете C99, синтаксис:

((pair) {.key = key, .value = value}); 

См, например gcc's documentation on compound literals.