Size: a a a

2020 May 24

D

Dr Zlo in Embedded Group
Сиие Сууие
А вы где меряете? Меряйте прям у приёмника
Я уже решил проблему. Дело не в бобине, и даже не в кабине.
источник

K

Kernel M.D. in Embedded Group
Добрый день. С вами в эфире снова странные истории про 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
источник

SK

Stas Koynov 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
вы понимаете, что вектор может изменить локацию данных? это динамический массив, и то что раньше куда-то указывало.  сейчас указывает в никуда либо туда куда вам низя!. если вы знаете максимальный случай заполнения массива(вектора) то сделайте резерв нужного размера и будем вам найс
источник

K

Kernel M.D. in Embedded Group
Stas Koynov
вы понимаете, что вектор может изменить локацию данных? это динамический массив, и то что раньше куда-то указывало.  сейчас указывает в никуда либо туда куда вам низя!. если вы знаете максимальный случай заполнения массива(вектора) то сделайте резерв нужного размера и будем вам найс
Я заведомо указываю в середину вектора и никаких других операций на время жизни указателя с ним не проводится.
источник

SK

Stas Koynov in Embedded Group
ну не может такого быть!
источник

K

Kernel M.D. in Embedded Group
Но есть! Я сам в большом шоке.
источник

SK

Stas Koynov in Embedded Group
ну давай минимальный пример на ванбоксе
источник

K

Kernel M.D. in Embedded Group
Честно, я уже грешу на баг компилятора, битую плашку оперативной памяти или еще какую-то дрянь.

Постараюсь собрать пример, но это, наверное, не быстро
источник

SK

Stas Koynov in Embedded Group
ну может пока будешь пример собирать что-то найдется.
источник

SK

Stas Koynov in Embedded Group
ну такие задачи всегда лучше с примерами, а то это гадание на кофейной гуще...
источник

VK

Valentin Kornienko 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
Похоже на инвалидацию итератора/гонку данных.
источник

BV

Bulat Valeev in Embedded Group
Прям точно что с вектором ничего не происходит?
источник

VK

Valentin Kornienko in Embedded Group
Просто. Можно взять и поставить data modify breakpoint,  если это под visual studio происходит.
источник

VK

Valentin Kornienko in Embedded Group
И посмотреть, так ли действительно никто у вас не модифицирует вектор
источник

K

Kernel M.D. in Embedded Group
Bulat Valeev
Прям точно что с вектором ничего не происходит?
Работаю с ним из одного потока, одним классом.
источник

K

Kernel M.D. in Embedded Group
Valentin Kornienko
И посмотреть, так ли действительно никто у вас не модифицирует вектор
Qt Creator. Я смотрел руками на значение указателя/итератора сразу после создания и оно уже невалидно
источник

VK

Valentin Kornienko in Embedded Group
Kernel M.D.
Qt Creator. Я смотрел руками на значение указателя/итератора сразу после создания и оно уже невалидно
После создания у вас аллоцируется кусок памяти.
источник

VK

Valentin Kornienko in Embedded Group
Попробуйте . reserve сделать перед вызовом insert.
источник

K

Kernel M.D. in Embedded Group
Valentin Kornienko
После создания у вас аллоцируется кусок памяти.
* после создания итератора, конечно
источник

K

Kernel M.D. in Embedded Group
Добавил перед insert reserve (size + N) и теперь проблема происходит в разные моменты. Стало понятно еще меньше :/
источник