2015-03-01 1 views
2

Мне нужно создать funcion, который получает указатель на структуру и указатель void, он возвращает 1, если элемент находится в структуре.Сравните элемент внутри структуры с значением указателя void в C

typedef struct { 
    char *sx; 
    int val, code, qtty; 
    char abc [20]; 
} ST_DAT; 

int compare (ST_DAT *, void *); 

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

int (*pfun)(ST_DAT *, void *)); 

Проблема в том, что я не знаю, как сравнить void * к другим значениям, пока не найду или не значение внутри.

int compare (ST_DAT *stData, void *key) 
{ 
    if (key == (*stData).val || key == (*stData).code || key == (*stData).qtty || strcmp (key,(*stData).abc) || strcmp (key,(*stData).sx)) 
    { 
     return 1; 
    }else{ 
     return 0; 
    } 
} 

Это правильно?

+1

Как называется «сравнение»? – mafso

+0

... или даже более конкретный: что передается как 2-й параметр при вызове 'compare()'? – alk

+0

... нажмите этот f ... f ... смешной сдвиг в следующий раз, если вы наберете «I» ... – peterh

ответ

1

(*stData).val имеет int типа, поэтому вам нужно бросить key к int * и затем разыменования это так:

*(int *)key == (*stData).val 
+0

Если я хочу использовать оператор ->, это будет выглядеть так: * (int *) key == stData-> val right? – rockstiff

+0

@rockstiff; Да. – haccks

+1

В зависимости от того, что передается как «ключ», такой код будет сталкиваться с уродливыми проблемами выравнивания. Вы не должны указывать 'char'-pointer, чтобы стать указателем' int', если бы указатель никогда не указывал на 'int', например. – alk

0

Вы должны типаж в key согласно данным вы сравниваете. И вы должны убедиться, что вы сравниваете значение с указателем, а не с самим указателем в случае int.

if (*(int*)key) == (*stData).val || *(int *)key == (*stData).code || (int *)*key == (*stData).qtty || strcmp((char *)key,(*stData).abc) || strcmp ((char *)key,(*stData).sx)) 
+1

«только код-ответы» редко оцениваются как SO. – alk

+0

там вы идете. К сожалению, после вставки источника был отключен. –

+0

Ваш подход сталкивается с теми же проблемами, о которых я прокомментировал в своем комментарии к запросу haccks. – alk

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