2016-10-06 4 views
0

Так что у меня те, в .h
разыменования 'пустота * указатель на C

stable.h 

// The symbol table. 
typedef struct stable_s *SymbolTable; 

// Data stored. 
typedef union { 
    int i; 
    char *str; 
    void *p; 
} EntryData; 

// Return struct for stable_insert. 
typedef struct { 
    int new; // Was a new entry created? 
    EntryData *data; // Data associated with entry. 
} InsertionResult; 

etc 

Тогда в моей .c

stable.c 

etc 

typedef struct { 
    char *key; 
    EntryData data; 
} Entry; 

struct stable_s { /* Indice hash */ 
    char index; 
    int size; 
    void *pointer; 
}; 

etc 

EntryData *stable_find(SymbolTable table, const char *key){ 
    int k; 
    char c; 

    if (key[0] >= 'A' && key[0] <= 'Z') 
     c = table[(key[0] - 65)].index; 
    else if (key[0] >= 'a' && key[0] <= 'z') 
     c = table[(key[0] - 141)].index; 
    else 
     c = table[26].index; 

    c -= 65; 

    if (table[c].size == 0) 
     return NULL; 

    k = busca_binaria(table[c].pointer, table[c].size, key); 
    if (strcmp(table[c]->pointer[k]->key, key) == 0) 
     return table[c]->pointer[k]->data; 

    return NULL; 
} 

И gcc -std=c99 stable.c -o stable дает мне эти ошибки:

stable2.c: In function ‘stable_find’: 
stable2.c:128:24: error: invalid type argument of ‘->’ (have ‘struct stable_s’) 
if (strcmp(table[c]->pointer[k]->key, key) == 0) 
stable2.c:129:24: error: invalid type argument of ‘->’ (have ‘struct stable_s’) 
    return table[c]->pointer[k]->data; 

Что мне не хватает? Я действительно потерялся в синтаксисе.

+0

Что 'SymbolTable'? –

+0

Является ли ваш компилятор '' '' '' '' '' '' '' '' неподписанным '? Из-за этого выражения 'key [0] - 141' –

+0

@EugeneSh .: См. Stable.h выше:' typedef struct stable_s * SymbolTable; ' –

ответ

0

Давайте посмотрим на эти строки:

k = busca_binaria(table[c].pointer, table[c].size, key); 
if (strcmp(table[c]->pointer[k]->key, key) == 0) 
    return table[c]->pointer[k]->data; 

Что такое table? Это struct stable_s *

Так

table[c] 

является struct stable_s - и это не указатель.

Итак, вернемся к линиям:

k = busca_binaria(table[c].pointer, table[c].size, key); 
        ^^^^^^^^^^^^^^^^ 
        Correct as table[c] is a struct stable_s 

if (strcmp(table[c]->pointer[k]->key, key) == 0) 
      ^^^^^^^^^^^^^^^^^^^^ 
      Wrong as table[c] is not a point 

    return table[c]->pointer[k]->data; 
      ^^^^^^^^^^^^^^^^^^^^ 
      Wrong as table[c] is not a point 

Там, как представляется, другие проблемы в коде (например, разыменования `недействительным *), но выше, должны относиться к ошибкам компилятора.

Может быть, эта линия:

if (strcmp(table[c]->pointer[k]->key, key) == 0) 

должен быть:

if (strcmp(((Entry*)table[c].pointer)[k].key, key) == 0) 

, но я не могу быть уверен, что вы не писали код, который говорит это.

А может быть, эта линия:

return table[c]->pointer[k]->data; 

должно быть:

return &(((Entry*)table[c].pointer)[k].data); 
+0

Затем я получаю эти ошибки: stable2.c: 128: 33: warning: dereferencing 'void *' pointer if (strcmp ((таблица [c] .pointer [k] -> ключ), ключ) == 0) stable2.c: 128: 5: ошибка: значение void не игнорируется, поскольку оно должно быть if (strcmp ((таблица [c] .pointer [k] -> ключ), ключ) == 0) stable2.c: 129: 32: предупреждение: разыменование «void *» указатель таблица возврата [c] .pointer [k] -> данные; stable2.c: 129: 9: ошибка: значение void не игнорируется, поскольку оно должно быть таблица возврата [c] .pointer [k] -> данные; – Paul

+0

Тогда я не знаю, как наложить мой указатель на пустоту:/ – Paul

+0

@Paul - правда, вы не можете разыменовать 'void *' - вам нужно знать тип исходного указателя и отбрасывать его в этот тип. Как вы инициализируете «указатель»? – 4386427

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