C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
работf с битовым вектором (STL), как найти ошибку
kea
Отправлено: 06.01.2006, 00:50


Станционный диспетчер

Группа: Участник
Сообщений: 80



Здравствуйте!
Работаю с битовым вектором на 16 бит.
_M_offset для _M_start имеет значение 0
_M_offset для _M_finish имеет значение 16.

Перед появлением ошибки параметры принимают следующие значения:
Bits={_M_start:{_M_p::00D7EFAC, _M_offset:13974884},
_M_finish:{_M_p::00D7F030, _M_offset:13977060},
_M_end_of_storage:{_M_data::00DDA7A0}}

(строчку записал по подсказке tooltip expression evaluation).

Как определить в каком месте программы происходит ошибка?
Может быть, кто назовет сходу возможные(!) причины появления таких значений смещений.

Ошибка происходит не сразу после запуска, а на 8-ой итерации работы.
Admin
Отправлено: 09.01.2006, 09:53


Владимир

Группа: Администратор
Сообщений: 1190



_M_offset для _M_finish имеет значение 15 ?

Отредактировано Admin — 09/01/2006, 09:55
kea
Отправлено: 25.01.2006, 01:04


Станционный диспетчер

Группа: Участник
Сообщений: 80



QUOTE (Admin @ 09/01/2006, 09:53)
_M_offset для _M_finish имеет значение 15 ?

Здравствуйте! __M_offset для _M_finish имеет значение 16.
kea
Отправлено: 25.01.2006, 01:18


Станционный диспетчер

Группа: Участник
Сообщений: 80



Здравствуйте! Думается надо сделать пояснения. Работаю с параметризованным контейнером. Вопрос о методе выделения памяти для элементов этого контейнера уже задавал, там приводил описание его класса.
Объектами у меня могут быть C1, содержащий две переменных int P1 и int P2 и битовый вектор vector bv размера P1*P2. C2 содержит переменную int P1 vector dv размера P1.

Создаю контейнер с элементами C2, затем создаю контейнер с элементами C1 предварительно удаляя перед этим контейнер с C2.

Затем создаю контейнер снова C2 и при удалении C1 возникает крах системы. Просматриваю значение bv перед крахом (в деструкторе перед вызовом опреатора clear() для bv
для _M_start и _M_finish _M_offset имеет значение 0.
** Admin
Отправлено: 25.01.2006, 17:22


Не зарегистрирован







Я не вникал в суть, не разбирался с кодом, имел ввиду другое.
Если элементов — 16 (например бит), и первый начинается с нуля,
то последний элемент будет иметь индекс 15, а не 16.

А 16 — уже сдвинитесь на область памяти, занятую чем то еще,
и можете получить AV.
kea
Отправлено: 25.01.2006, 19:17


Станционный диспетчер

Группа: Участник
Сообщений: 80



QUOTE (** Admin @ 25/01/2006, 17:22)
Если элементов — 16 (например бит), и первый начинается с нуля,
то последний элемент будет иметь индекс 15, а не 16.

А 16 — уже сдвинитесь на область памяти, занятую чем то еще,
и можете получить AV.

Здравствуйте! Показывает именно 16. Даже если просто создать вектор vector bv(16). Что такое AV?
Георгий
Отправлено: 26.01.2006, 00:01


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Acces Violation
Boyko
Отправлено: 31.01.2006, 10:11


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (** Admin @ 25/01/2006, 16:22)
Я не вникал в суть, не разбирался с кодом, имел ввиду другое.
Если элементов — 16 (например бит), и первый начинается с нуля,
то последний элемент будет иметь индекс 15, а не 16.

А 16 — уже сдвинитесь на область памяти, занятую чем то еще,
и можете получить AV.

Я тоже не вникал в суть. smile.gif
В STL всегда так, finish показывает не последнего элемента, а следующий его элемент
kea
Отправлено: 06.02.2006, 15:22


Станционный диспетчер

Группа: Участник
Сообщений: 80



Здравствуйте! В поиске ошибки помогло использование функции at() вместо оператора [] при обращении к элементам вектора.
Спасибо всем за советы!

Вернуться в Вопросы программирования в C++Builder