2016-11-09 7 views
-1

Я пытаюсь передать структуру функции, чтобы использовать многопоточность в C. Я действительно не понимаю, как это работает, поэтому я просто пробовал различные синтаксисы, которые дают множество сообщений об ошибках, поэтому я не уверен, был ли ранее задан мой конкретный запрос. Я собрал самый простой код, который я могу сделать, который напоминает то, что я хочу сделать, и он все еще дает мне ошибку, даже если я настроил его на соответствие аналогичным примерам на этом сайте, которые, видимо, работали для людей. Я надеюсь, что я просто пропустил что-то очень простое. Во всяком случае, вот код, который не будет компилировать:Неверный инициализатор при передаче структуры как указатель void *

#include <pthread.h> 
#include <stdio.h> 

typedef struct { 
    int i_start; 
    int i_end; 
} my_struct; 

void *func(void *ptr) { 

    int j_start; 
    int j_end; 

    my_struct input = (my_struct *) ptr; 
    j_start = input.i_start; 
    j_end = input.i_end; 
    printf("%d %d\n", j_start, j_end); 

} 

int main() { 
    my_struct qwerty; 

    qwerty.i_start = 0; 
    qwerty.i_end = 1; 

    pthread_t tid; 

    pthread_create(&tid, NULL, func, &qwerty); 

    return 0; 
} 

Этот конкретный код дает мне ошибку компиляции:

test.c: In function 'func': 
test.c:14:20: error: invalid initializer 
    my_struct input = (my_struct *) ptr; 

Как я уже сказал, я попробовал несколько разные вещи, но я не могу сделай это правильно. Спасибо за любую помощь.

+1

'my_struct input = (my_struct *) ptr;' -> 'my_struct input = * (my_struct *) ptr;'. Также 'func' должен вернуть значение. – BLUEPIXY

+0

Обучение C экспериментом приведет вас к тому месту, которое вы не хотите получать. –

+0

Кроме того, у вас может возникнуть другая проблема: основной поток может выйти до того, как поток func может начать или завершить. См. Это в разделе [как обратиться к нему] (http://stackoverflow.com/a/40514326/1275169). –

ответ

2

my_struct input = (my_struct *) ptr;

Тип input является my_struct, и вы пытаетесь присвоить значение my_struct * (указатель на my_struct) к нему. Типы должны совпадать.

Попробуйте использовать тип указателя и разыменования его (чтобы получить простое my_struct значение):

my_struct *input = (my_struct *) ptr; 
j_start = (*input).i_start; 
j_end = (*input).i_end; 

Или используя сам указатель с оператором стрелки:

my_struct *input = (my_struct *) ptr; 
j_start = input->i_start; 
j_end = input->i_end; 

Или вы можете разыменования перед тем присвоение:

my_struct input = *((my_struct *) ptr); 
j_start = input.i_start; 
j_end = input.i_end; 

Этот синтаксис может ввести в заблуждение, так что будьте su re посмотреть, как работает оператор * и как он отличается от *, используемого в типе переменной.