Передача структуры в обобщенную функцию в C - PullRequest
0 голосов
/ 18 апреля 2011

Я объявляю новую структуру с именем "Struct" У меня есть универсальная функция, которая принимает аргумент "void * data".

void Foo(void *data)

Я передаю экземпляр Struct в универсальную функцию.

Struct s;
Foo(&s);

Я хочу получить доступ к одному из свойств структуры в функции.

void Foo(void *data) {
    char *word = (char*) data.word;
}

Это недопустимо, поскольку не распознает данные как допустимые структуры.

Я даже сначала пытаюсь объявить данные как тип структуры, и получаю ошибку.

void Foo(void *data) {
    Struct s = (Struct) data;
    char *word = s.word;
}

Я получаю "запрос на преобразование в нескалярный тип".

Ответы [ 7 ]

3 голосов
/ 18 апреля 2011

Прежде всего, вы должны включить флаги предупреждения вашего компилятора (все они).Затем вы должны передать указатель на ваш Struct и использовать в качестве имени переменной что-то отличное от struct:

Struct s;
Foo(&s);

Затем в Foo:

void Foo(void *data) {
    Struct *s    = data;
    char   *word = s->word;
}

Youне может конвертировать не указательные типы в void* и обратно, как вы пытаетесь, преобразование типов указателей в void* и обратно, с другой стороны, допустимо.

2 голосов
/ 18 апреля 2011

Вам нужно передать указатель на вашу структуру и получить указатель на структуру внутри функции:

Struct struct;
Foo(&struct);

void Foo(void *data) {
    Struct* struct = (Struct*) data;
    char *word = struct->word;
}
1 голос
/ 18 апреля 2011

Для начала нужно правильно вызвать функцию:

Struct s;
Foo(&s);

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

Теперь функция должна знать , что вы используете Struct (в отличие от чего-то другого) - возможно, из-за другого параметра, глобальной переменной или по какой-то другой причине. Тогда внутри функции вы можете сделать:

void Foo(void *data) {
    Struct *structpointer = p; /* Note - no need for a cast here */


    /* (determine whether data does refer to a pointer then...) */
    char *word = structpointer->word;
    /* ... then use 'word'... */
}
1 голос
/ 18 апреля 2011

Вы должны использовать оператор -> при запросе члена структуры через указатель.

Это должно работать: char *word = (char*) data->word;

Вы также должны передать адрес структуры функции,Как это: Foo(&struct);.

0 голосов
/ 18 апреля 2011
Struct struct;
Foo((void*)&struct);

void Foo(void *data) {
    Struct *struct = (Struct*)data;
    char *word = struct->word;
}

или более компактная форма:

Struct struct;
Foo((void*)&struct);

void Foo(void *data) {
    char *word = ((Struct*)data)->word;        
}
0 голосов
/ 18 апреля 2011

Вы смешиваете указатели и данные.

Struct struct определяет объект данных
void *data ожидает, что data будет указателем.

Вызовите Foo суказатель на Struct и другие необходимые изменения

0 голосов
/ 18 апреля 2011

Данные являются указателями, поэтому, что бы вы ни приводили, они также должны быть указателями. Если бы вы сказали Struct* myStruct = (Struct*) data, все было бы хорошо с миром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...