2013-06-19 162 views
0

我想一個struct添加到結構的數組,但我得到一個錯誤:Parse Issue: Expected expression。下面是我的代碼:C結構分配到結構陣列

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*所以我雖然它可以工作。

我在Mac上使用Xcode。

+0

太可怕了,太可怕了,宏的使用。 – unwind

+0

'pair p; p.key = key; p.value =值; var_name-> pairs [var_name-> size ++] = p ;,但仍然無效。這裏有什麼問題,宏參數的名字是重複的(帶有struct成員)。 – 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

注:錯誤做免費 – BLUEPIXY

+0

這個工作,但爲什麼我必須從'key'改爲'_key '從'價值'到'_價值'? –

+1

@ aizen92成員名稱和宏參數是重複的。例如。 '對p; p.key = key;'宏擴展 - >>'對p; p。「key」=「key」;' – BLUEPIXY

0

除非它只是一個格式問題,在我看來就像你有在大括號的錯誤的一邊分號{ .key = key, .value = value; }

應改爲{ .key = key, .value = value };

+0

葉,分號是沒有道理的,但即使沒有它,或在''{我仍然得到同樣的錯誤 –

0

你不能擁有匿名結構初始值設定表達式,編譯器應該如何知道它有什麼類型?

假設你正在使用C99,語法是:

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

例如見gcc's documentation on compound literals