Это мой первый пост, поэтому, пожалуйста, будьте осторожны.
В прошлом я время от времени играл с Си. Теперь я дошел до того, что начал настоящий проект (движок 2D-графики, использующий SDL, но это не имеет значения для вопроса), чтобы сказать, что у меня есть некоторый реальный опыт работы с Си. Вчера, работая над системой событий, я столкнулся с проблемой, которую не смог решить.
Вот этот typedef,
//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);
}
Прежде всего, я пропустил некоторые проверки ошибок, а также код, который перераспределяет вектор обратного вызова, когда количество обратных вызовов превышает размер вектора.
Однако, когда я запускаю этот код, программа падает, как описано в коде. Я предполагаю ошибку сегментации, но я не могу быть уверен, так как никакого вывода не дается. Я также предполагаю, что ошибка происходит из-за несколько ошибочного понимания того, как объявлять и выделять массив указателей на указатели функций.
Пожалуйста, переполнение стека, направляй меня.
РЕДАКТИРОВАТЬ: Я не могу понять, как сделать отступ для блоков кода. Это немного смущает ...
РЕДАКТИРОВАТЬ: не имеет значения. Проверил на странице источник некоторых других постов =).