Это мой первый пост, поэтому, пожалуйста, будьте осторожны.Объявление, распределение и назначение массива указателей на указатели функций
Я играл с C время от времени в прошлом. Теперь я дошел до того, что начал реальный проект (2D-графический движок с использованием SDL, но это не имеет значения для вопроса), чтобы иметь возможность сказать, что у меня есть реальный опыт C. Вчера, работая над системой событий, я столкнулся с проблемой, которую я не мог решить.
Там эта ЬурейеЕ,
//the void parameter is really an SDL_Event*.
//but that is irrelevant for this question.
typedef void (*event_callback)(void);
который определяет сигнатуру функции должны быть вызваны в событиях двигателя.
Я хочу иметь возможность поддерживать несколько event_callbacks, поэтому массив этих обратных вызовов будет идеей, но не хочу ограничивать количество обратных вызовов, поэтому мне нужно какое-то динамическое распределение. Именно здесь возникла проблема. Моя первая попытка прошла так:
//initial size of callback vector
static const int initial_vecsize = 32;
//our event callback vector
static event_callback* vec = 0;
//size
static unsigned int vecsize = 0;
void register_event_callback(event_callback func) {
if (!vec)
__engine_allocate_vec(vec);
vec[vecsize++] = func; //error here!
}
static void __engine_allocate_vec(engine_callback* vec) {
vec = (engine_callback*) malloc(sizeof(engine_callback*) * initial_vecsize);
}
Прежде всего, я опустил некоторые проверки ошибок, а также код, который перераспределяет вектор обратного вызова, когда число обратных вызовов превышает вектор размера.
Однако, когда я запускаю этот код, программа вылетает, как описано в коде. Я предполагаю ошибку сегментации, но я не могу быть уверен, так как никакой вывод не задан. Я также предполагаю, что ошибка возникает из-за некорректного понимания того, как объявлять и выделять массив указателей на указатели на функции.
Пожалуйста, переполнение стека, направляйте меня.
EDIT: Я не могу понять, как отступать от блоков кода. Это почти немного смущает ...
EDIT: Не обращайте на это внимания. Проверял источник страницы некоторых других сообщений =).
Вы должны выравнивал код на 4 пробела для того, чтобы быть правильно отформатирована. – Artefacto
Используйте кнопку '101010' на странице редактирования, чтобы пометить текст в код. – sbi
Вам нужно двойное косвенное обращение в __engine_allocate_vec – Artefacto