2015-02-07 2 views
0

qq4all. У меня есть задача - написать конфигурационный парсер для синтаксиса, как это:Не удается записать данные в структуру

[module] 
name = first 
imitationType = first 

[module] 
name = second 
imitationType = second 

и т.д. я нашел довольно конфигурационный анализатор - inih, но я не могу заставить его работать, как я хочу. Вот мой код, writed над inih Например:

typedef struct { 
    const char* name; 
    const char* imitation_type; 
} module_config; 

int module_count = 0; 

static int handler(void* user, const char* section, const char* name, 
        const char* value) 
{ 
    module_config* pconfig = (module_config*)user; 
    pconfig = (module_config *) malloc(module_count*sizeof(module_config)); 
    #define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0 
    if (strcmp(section, "module") == 0) { 
     if (MATCH("module", "name")) { 
      pconfig[module_count]->version = strdup(value); 
     } else if (MATCH("module", "imitationType")) { 
      pconfig[module_count]->name = strdup(value); 
     } else { 
      return 0; /* unknown section/name, error */ 
     } 
    ++module_count; 
    pconfig = (module_config *) realloc(pconfig, module_count * sizeof(module_config)); 
} 

return 1; 
} 

Но, когда я пытаюсь скомпилировать это, я получаю следующую ошибку:

Error! Expression for '->' must be 'pointer to struct or union'

для этих линий:

pconfig[module_count]->version = strdup(value); 
pconfig[module_count]->name = strdup(value); 

Я новичок в программировании, и не понимаю, почему это происходит. Пожалуйста, помогите :-)

ответ

1

pconfig - это указатель на экземпляр модуля module_config.

Использование pconfig [module_count] в этом указателе эквивалентно разыменованию указателя (pconfig+module_count), то есть оно эквивалентно *(pconfig+module_count).

Таким образом, pconfig[module_count] больше не указатель. Вы должны использовать pconfig[module_count].version или (pconfig+module_count)->version.