0

構造体の配列に構造体を追加しようとしていますが、エラーが発生しています: Parse Issue: Expected expression. 以下は私のコードです:

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を使用しています。

4

3 に答える 3

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
于 2013-06-19T09:37:07.533 に答える
0

単なる書式設定の問題でない限り、中括弧の反対側にセミコロンがあるように見えます{ .key = key, .value = value; }

代わりにする必要があり { .key = key, .value = value };ます。

于 2013-06-19T09:32:30.370 に答える
0

匿名の構造体初期化子式を使用することはできません。コンパイラはどのような型を持っているかをどのように知る必要がありますか?

C99 を使用していると仮定すると、構文は次のようになります。

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

たとえば、複合リテラルに関する gcc のドキュメントを参照してください。

于 2013-06-19T09:33:04.930 に答える