указатели на функции — обратные вызовы чтения Ogg vorbis — различия в синтаксисе в переполнении стека

У меня были проблемы с не работающими обратными вызовами Ogg Vorbis, в частности с обратным вызовом read_func, остальные, похоже, работали. Я только что сделал это (на мой взгляд, бессмысленно) изменение, и вдруг оно заработало. Кто-нибудь знает точно, почему, потому что мне трудно увидеть точную разницу здесь. Кажется, необходимо явное приведение к указателю на функцию?

ДО (Ogg не может прочитать правильные данные заголовка, несмотря на попытки):

ov_callbacks oggFileCallbacks;

oggFileCallbacks.read_func = ogg_read_func;
oggFileCallbacks.seek_func = ogg_seek_func;
oggFileCallbacks.tell_func = ogg_tell_func;
oggFileCallbacks.close_func = ogg_close_func;

ПОСЛЕ (работает отлично, как и ожидалось):

ov_callbacks oggFileCallbacks = {
(size_t (*)(void *, size_t, size_t, void *))  ogg_read_func,
(int (*)(void *, ogg_int64_t, int))           ogg_seek_func,
(int (*)(void *))                             ogg_close_func,
(long (*)(void *))                            ogg_tell_func
};

РЕДАКТИРОВАТЬ: Больше информации

Инициализация структуры действительно изменилась, когда я исправил проблему, потому что она была построена с использованием содержимого в скобках, но я почему-то подозреваю, что настоящей проблемой было отсутствие явного приведения. Я думал, что хорошо разбираюсь в C ++, но решил, что мне нужно по-настоящему попытаться выяснить эти странности, когда натолкнусь на них. Следует отметить, что мой код написан на C ++, а библиотека Vorbis написана на простом языке C. Я также решил заставить эти указатели функций использовать стиль объявления прототипов C, но это тоже не помогло.
Структура была инициализирована следующим образом (для старого способа, который не работает):

 ov_callbacks oggFileCallbacks;

Вот определение функции ogg_read_func:

size_t ogg_read_func(void *ptr, size_t size, size_t nmemb, void *datasource) {

Вот прототипы:

// Ogg read functions (mainly useful for android (non standard file io ))
extern "C" {
size_t ogg_read_func(void *ptr, size_t size, size_t nmemb, void *datasource);
int    ogg_seek_func(void *datasource, ogg_int64_t offset, int whence);
int    ogg_close_func(void *datasource);
long   ogg_tell_func(void *datasource);
}

Ogg_read_func был просто оболочкой для фрединга, когда я отлаживал проблему, и, несмотря на то, что до изменения инициализации структуры и выполнения приведения возвращалась ошибка, которая всегда была «Not ogg vorbis», или в кодовых терминах это значение:

#define OV_ENOTVORBIS -132

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]