У меня есть две функции C, которые в основном работают со структурой данных стека. Этот метод выдвигает значение типа OBJ
, которое на самом деле просто unsigned long
, на вершину стека. Стек также увеличивается при необходимости.
OBJ Quotation_push_(CzState *cz, CzQuotation *self, OBJ object)
{
if ((self->size + 1) > self->cap) {
self->items = (OBJ *)CZ_REALLOC(self->items, sizeof(OBJ) * (self->cap + 1) * 2);
self->cap = (self->cap + 1) * 2;
}
self->items[self->size++] = object;
return (OBJ)self;
}
Следующая функция вставляет OBJ
в произвольную позицию в массиве self->items
. Попробуйте, как я мог, это просто не будет работать должным образом. Я использую Quotation_push_
здесь с фиктивным значением, чтобы получить поведение автоматического роста. Проблема в том, что я всегда вижу фиктивное значение CZ_NIL
в конце массива с элементом, который я пытаюсь вставить, просто перезаписывая то, что уже находится в позиции. Вот что у меня так далеко:
OBJ Quotation_insert_(CzState *cz, CzQuotation *self, OBJ object, int pos)
{
printf("have to move %d OBJ from %d to %d\n", self->size - pos, pos, pos + 1);
Quotation_push_(cz, self, CZ_NIL);
memmove(self->items + ((pos + 1) * sizeof(OBJ)), self->items + (pos * sizeof(OBJ)), sizeof(OBJ) * (self->size - pos));
self->items[pos] = object;
return (OBJ)self;
}
Я не получаю никаких ошибок или ошибок, просто они не работают, как ожидалось. Есть идеи?