Size: a a a

2020 May 24

BV

Bulat Valeev in Embedded Group
Вы точно не добавляете компоненты в вектор после того как вызвали указатель?
источник

SK

Stas Koynov in Embedded Group
магия! не иначе
источник

K

Kernel M.D. in Embedded Group
Kernel M.D.
Добавил перед insert reserve (size + N) и теперь проблема происходит в разные моменты. Стало понятно еще меньше :/
Достаточно в этом уверен:
1) Модификация вектора происходит в одной функции, вызываемой в одном потоке
2) Все методы модификации вызываются до получения указателя
3) После изменения нескольких элементов указатель отбрасывается

К тому же, при пошаговом исполнении в отладчике я сразу получаю в переменной испорченное значение, равно как и при повторении ее инициализации в вычисляемом выражении.
источник

SK

Stas Koynov in Embedded Group
3 вы меняете данные через указатель?
источник

K

Kernel M.D. in Embedded Group
Да, через него. Элементы заведомо там.
источник

K

Kernel M.D. in Embedded Group
Впрочем, мне пора идти. Спасибо за помощь, попробую еще подумать над этим.
источник

K

Kernel M.D. in Embedded Group
Вернулся. Повторить проблему на примере не получилось: сильно замудренно я с этим вектором работаю, так что пришлось пойти другим путем: сделать пару методов, получающих и записывающих элемент по индексу, что вылечило проблему.
источник

RK

Rost K in Embedded Group
может там какое-то копирование всего вектора происходит при присвоении?
источник

CA

Cate Archer in Embedded Group
А у кого лазерная резка есть в спб?
источник

CA

Cate Archer in Embedded Group
Надо деревяшки фигурно вырезать..
источник

CA

Cate Archer in Embedded Group
Фаб лабы то не работают:(
источник

K

Kernel M.D. in Embedded Group
Rost K
может там какое-то копирование всего вектора происходит при присвоении?
Ч0рт его знает. Решил отложить задачу на далекое "отрефакторить нафиг"
источник

u

uis in Embedded Group
А. Ошибся чатом
источник

VO

Vyacheslav Olkhovche... in Embedded Group
Cate Archer
они исправляют)
https://www.fontanka.ru/2020/05/24/69276481/ вот типичный пример концентрированного косноязычия
источник

A

Alexey in Embedded Group
Cate Archer
А у кого лазерная резка есть в спб?
У моего приятеля есть, он точно работает
источник

A

Alexey in Embedded Group
Щас узнаю адрес
источник

A

Alexey in Embedded Group
источник

CA

Cate Archer in Embedded Group
о, спасиб.
источник
2020 May 25

AP

Anton Pushkov in Embedded Group
Kernel M.D.
Добрый день. С вами в эфире снова странные истории про std::vector. Изложу суть проблемы в том виде, в котором я ее понимаю сейчас:

Есть класс, в нем есть std::vector<float> в разные места которого периодически нужно писать данные. Вектор потихоньку растет со временем и, по некоторым причинам, реальное смещение в нем пользователю неизвестно. Поэтому есть функция, которая дает способ манипулировать конкретным элементом вектора и его соседями. Изначально ее прототип выглядел как float* f(uint32_t virt_off).

Однако, я обнаружил, что в один прекрасный момент эта функция начинала возвращать 0. Поотлаживавшись, я понял, что дело в том, что vec.data() + off начинает возвращать не _указатель_ на элемент, а его _значение_. Т.е. если вектор инициализируется через vec.insert(..., 0.0f), возвращается 0.0, если через 1.0f — 1.0. Причем, происходит это далеко не сразу и строго в определенный момент, что я вижу по значению virt_off.

То же самое происходит, если получать указатель через &vec[off] и даже если возвращать итератор вида vec.begin() + off.

Нагуглить ничего не получилось, буду признателен за все идеи о возможных причинах подобного поведения или указание на профильный чатик по плюсам, поскольку проблема не очень профильная. Linux Mint 19.3, G++ 7.5.0
Если у тебя есть индекс элемента, тебе не нужно возиться с адресами, просто бери адрес нужного элемента через &vec[offset]
источник

K

Kernel M.D. in Embedded Group
Anton Pushkov
Если у тебя есть индекс элемента, тебе не нужно возиться с адресами, просто бери адрес нужного элемента через &vec[offset]
Что, к слову, давало тот же результат.
источник