xzripper
@xzripper
0xC0000005

Vector не обновляется?

У меня есть ObjectsBuffer, который содержит std::vector<LevelObject> (objectsBuffer), а класс имеет функцию
updateObject(int index, LevelObject &updatedObject)
Исходный код функции:

void updateObject(int index, LevelObject &updatedObject) {
        this->getReferenceBuffer()[index] = updatedObject;
    }


getReferenceBuffer
std::vector<LevelObject> &getReferenceBuffer() {
        return this->objectsBuffer;
    }


Основной код:
LevelObject object = objectsBuffer.getWithIndex(selectedObjectIndex);

if(object.lobjecttype == LevelObjectType::RECTANGLE) {
    static char objectName[28];

    strcpy(objectName, object.lobjectname.c_str());

    static int objectWidth = object.objectWidth;
    static int objectHeight = object.objectHeight;

    static int objectX = object.objectX;
    static int objectY = object.objectY;

    ImGui::InputText("Object name.", objectName, IM_ARRAYSIZE(objectName));

    ImGui::InputInt("Object Width.", &objectWidth);
    ImGui::InputInt("Object Height.", &objectHeight);

    ImGui::InputInt("Object X.", &objectX);
    ImGui::InputInt("Object Y.", &objectY);

    if(ImGui::Button("Apply.")) {
        object.lobjectname = objectName;

        object.objectWidth = objectWidth;
        object.objectHeight = objectHeight;

        object.objectX = objectX;
        object.objectY = objectY;

        objectsBuffer.updateObject(selectedObjectIndex, object); // Сдесь пытаюсь обновить обьект.
    }
}


Из примера я получаю объект по индексу из вектора по индексу, изменяю его, а затем пытаюсь обновить объект. Все свойства, такие как objectWidth или другие, остаются прежними. Я не создаю буфер в цикле, я его нигде не перезаписываю (только обновляю его здесь и добавляю новые элементы). Как это исправить?
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
xzripper
@xzripper Автор вопроса
0xC0000005
Решено: функциия
show(ObjectsBuffer objectsBuffer, int selectedObjectIndex)
принимала аргумент - буфер, и видимо я пытался получить не копию буфера, уже копии буфера, решением было передать ссылку на буфер:
show(std::vector<LevelObject> &buffer, int selectedObjectIndex)
, и вызов функции стал таким:
ObjectEditorUI::show(objectsBuffer.getReferenceBuffer(), selectedObjectIndex)
(getReferenceBuffer вверху). Похоже я оеально упустил слишком много деталей, всем спасибо
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
(Исходя из обсуждения в комментариях)
Возможно, проблема с параллельным кодом. Какой-то код где-то изменяет вектор. Если не очевидно, где оно все перезаписывается, то помните, что добавление элементов вектор может вызвать увеличение внутреннего буфера и копирование всех элементов. Поэтому даже какой-то код, просто добавляющий новые элементы в вектор, может вызвать наблюдаемый эффект необъяснимой перезаписи объекта в векторе на предыдущее значение. Вообще, надо бы защищать вектор от параллельного доступа разными потоками всякими мютексами и критическими секциями. Ну нет, так поменяйте его хотя бы на list. тогда добавление новых элементов и изменение значений где-то не будут вызывать data race. Но тогда надо алгоритмы менять, ибо обращение по индексу - долгая операция.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы