Я знаю, что есть много ответов на вопросы о литье void * в struct, но я не могу заставить его работать правильно.C - cast void * to structure in thrd_create()
Ну, я хочу создать нить, которая будет воспроизводить музыку в фоновом режиме. У меня есть структура, которая собирающая заряженный массив музыкальных файлов и индекс начала и конца:
typedef unsigned char SoundID;
typedef unsigned char SongID;
typedef struct {
Mix_Music *songs[9]; // array of songs
SongID startId; // index of first song to play
SongID endId; // index of last song to play
} SongThreadItem;
Тогда я хочу играть песни, создавая поток и передавая функцию, которая на самом деле играет песню функции thread_create()
.
int play_songs(Mix_Music *songs[9], SongID startId, SongID endId, char loop){
thrd_t thrd;
SongThreadItem _item;
SongThreadItem *item = &_item;
memcpy(item->songs, songs, sizeof(item->songs));
item->startId = startId;
item->endId = endId;
printf("item->startId is %i\n", item->startId);
printf("item->endId is %i\n", item->endId);
thrd_create_EC(thrd_create(&thrd, audio_thread_run, item));
return 0;
}
int audio_thread_run(void *arg){
SongThreadItem *item = arg; // also tried with = (SongThreadItem *)arg
printf("item->startId is %i\n", item->startId);
printf("item->endId is %i\n", item->endId);
free(item);
return 0;
}
Тогда я получаю следующий результат:
item->startId is 0
item->endId is 8
item->startId is 6
item->endId is 163
значение извлекается внутри audio_thread_run()
являются не один ожидать. Я не знаю, поставил ли я достаточно кода, чтобы кто-то нашел мою ошибку, я стараюсь сделать его минимальным, потому что это часть более крупного проекта.
Заранее за вашу помощь.
Вы передаете указатель ('item') на автоматический объект (' _item'). К тому времени, когда поток работает, объект уже мертв. Вызов 'free' на то, что не было выделено с помощью' malloc', также является no-no. – molbdnilo