![]() |
raised exception class EAccesViolation при вызове LSQ_InsertFrontElement
что-то в функции LSQ_InsertFrontElement неправильно сделано
![]() вот фаилы: .c http://yadi.sk/d/SMXZ5cLR3JVRr .h http://yadi.sk/d/Go_5SIwB3IKuM или ниже код: //___________________________________ Код:
#ifndef LINEAR_SEQUENCE_H_INCLUDED |
pkkirill, правильно, а что вы хотели?
Вы делаете указатель на некоторую область памяти, а затем делаете "указатель + 1" это несанкционированная попытка доступа к памяти. Такие фокусы запрещены ЕМНИП с 80386 процессоров, когда появился защищенный режим. Сейчас попробую объяснить на пальцах. Вот мы получили указатель Handle. Он ссылается на некоторую ячейку памяти. Дальше, вместо того, чтобы вызвать отдельную процедуру выделения памяти, ты говоришь size+1. Что происходит в этом случае? (Во первых я не совсем понял, что за size, но предположу, что размер контейнера; Во вторых плюс один "чего"? Байт, Слово, Длинное слово?) Указывая на некоторую ячейку А, мы хотим получить прямой доступ к ячейке А+1. Но! Никто не гарантирует, что ячейка А+1 свободна. В ней могут содержать данные других программ! Это потенциально ведет к нарушению целостной работы системы. Посмотрите Переполнение буфера и Переполнение буфера для чайника(последняя для новичков, но не чайников) |
в поле size хранится кол-во элементов в контейнере
я хочу увеличить значение поля size в структуре, адрес которой хранится в переменной con то есть по идее (*con).size и есть это значение? а (*con).size++; должно увеличивать это значение на 1 Я правильно понимаю? *con мы получаем саму структуру по ее адресу (*con).size - получаем поле size данной структуры |
Цитата:
Смотри еще наглядней. Есть карта политическая карта мира (оперативная память). На карте есть государства Европа, Россия, Китай и т.д. всё как полагается. Эта территория отведена под страны (под программы). Ты делаешь переменную-ссылку, допустим на Францию (con). А затем хочешь легким росчерком пера расширить ее границы. Мол, ребят, соседние государства, простите, но мне тут ваши луга и леса нужны, поэтому отныне вы (size+1, хопа!) мои! Ни тебе согласования границ (межевание, кадастровая регистрация, международные отношения), ни военной экспансии, ничего! Просто взял карандашом и нарисовал границы как тебе нравятся. Непойдет. Неа :no: Хочешь расширять границы -- вызывай процедуры согласования земель. Оператор new или ему подобный. |
size это просто число в структуре типа LSQ_HandleT*, которую мы уже создали в функции LSQ_CreateSequence(), память для этой структуры мы выделили (malloc) и даже присвоили значение полю size=0;
Код:
LSQ_HandleT LSQ_CreateSequence() //создать контейнер а указатель на стр-ру типа LSQ_HandleT* (память для которой уже выделялась раннее) идет в качестве параметра данной функции, который затем типизируется таким способом struct LSQ_HandleT* con = handle; вот кстати C-фаил: Код:
#include <stdio.h> |
|
вот все что из папки с проектом
среда C++ Builder 6 |
все дело было в неправильном вызове функции CreateSequence:
Код:
#include <stdio.h> |
Время: 19:07. |
Время: 19:07.
© OSzone.net 2001-