2015-06-19 2 views
1

Я совершенно новый для C. Я пробовал другие ссылки, но не кости
Я использую Xcode 6.1, и я получаю следующие вопросы:.Получение Прогнозного идентификатора или «(» выпуска в Xcode 6.1

Анализировать Выпуск: Ожидаемый идентификатор или '('
Семантический Проблема: Неожиданное имя типа 'карта'

Вот мой код:

//hashmap.h 
#ifndef __HashMap__hashmap__ 
#define __HashMap__hashmap__ 

void map_init(); 
void map_insert(uint8_t, uint8_t); 
uint8_t map_getVal(uint8_t); 

#endif /* defined(__HashMap__hashmap__) */ 

//hashmap.c 
#include <stdint.h> 
#include "hashmap.h" 

#define KEY_NOT_FOUND -1 

static int i = 0; 

typedef struct HashMap { 
    uint8_t KEY; 
    uint8_t VAL; 
} *map; 

void map_init() { 
    map = (HashMap*) calloc(1, sizeof(HashMap));    //Parse Issue 
} 

void map_insert(uint8_t key, uint8_t val) { 
    int size; 
    map[i].KEY = key;           //Parse Issue 
    map[i].VAL = val;           //Parse Issue 
    i++; 
    size = i + 1; 
    map = (HashMap*) realloc(map, size * sizeof(HashMap));  //Parse Issue 
} 

int map_search(HashMap map[], uint8_t key) { 
    int index, size = i; 
    for(index = 0; index <= size; index++) 
     if(map[index].KEY == key) 
      return index; 
    return KEY_NOT_FOUND; 
} 

uint8_t map_getVal(uint8_t key) { 
    return map[map_search(map, key)].VAL;      //Semantic Issue 
} 

Я попытался заменить карты [I] с обозначениями массива указателя (картой + I) дает тот же результат. Также не стесняйтесь указать, как мой хэш-план будет проваливаться после устранения проблем.

+0

Ваш HashMap будет флоп, потому что это не HashMap. – erip

+0

Ваша «карта» - это тип. –

+0

вы не указали переменную map в 'map_insert'' map_getVal'. в карте «map_init» выделяется, но не возвращается, вы ее не сохранили. Вы можете либо сделать «map» статической переменной, либо сохранить значение и передать «map» для каждого вызова функции, как и то, что вы сделали с «map_search» – vincentleest

ответ

1

Изменение:

typedef struct HashMap { 
    uint8_t KEY; 
    uint8_t VAL; 
} *map; 

с:

typedef struct HashMap { 
    uint8_t KEY; 
    uint8_t VAL; 
} HashMap ; 

HashMap *map; 
+0

Не хватило репутации, чтобы дать вам преимущество. Ура! – Jimmy

3

ЬурейеЕ:

typedef struct HashMap { 
uint8_t KEY; 
uint8_t VAL; 
} *mapEntry; 

определяет новый тип под названием *mapEntry. Затем вы можете создать фактическую переменный:

mapEntry map; 

Теперь, остальная часть коды должен быть интерпретируемым в map относится к переменному, а не типу.

+0

'map' на самом деле является типом указателя на структуру. Но op использует его как переменную. –

+0

@EugeneSh. Извинения, мой последний опыт работы с C был дрянной нокаутом под названием «RobotC» (язык не был моим выбором). На самом деле это не поддерживало указателей, и я забыл хорошую часть синтаксиса. – hexafraction

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