Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.24;
Скачать: CL | DM;

Вниз

Динамические массивы и SetLength   Найти похожие ветки 

 
boband   (2003-03-12 09:45) [0]

При использовании процедуры SetLength возникает ошибка access violation. При чем в 99 случаях все отрабатывает нормально, а в 100-м такая проблема. Подскажите в чем прикол, пожалуйста!

Цитата из исходника:
type
PMyColl=^TMyColl
TMyColl=record
Support:integer;
Coll: array of integer;
end;
...
var
Coll:PMyColl; lngt:integer;
...
new(Coll);
Coll^.Support:=15;
SetLength(Coll^.Coll, lngt);//Вот здесь и возникает проблема!!!


 
KpeHgeJIb   (2003-03-12 10:07) [1]

Когда ты создаеш переменную Cool для нее выделяется количество памяти которое она занимает, НО когда это происходит, поле Cool^.cool пусто и занимает мало памяти, при увеличении его длинны ты вылазиш за пределы выделеной памяти для переменной Cool и получаеш access violation.


 
NailS ©   (2003-03-12 10:07) [2]


> При чем в 99 случаях все отрабатывает нормально, а в 100-м
> такая проблема.

Терзает смутное сомнение, что собака порылась в другом месте (в работе с Coll). Память не течет случаем?
Да и кода бы побольше не помешало.


 
Fredericco ©   (2003-03-12 10:14) [3]

Проверь значение lngt во всех ста случаях и напиши о результатах.


 
Владислав ©   (2003-03-12 12:02) [4]

Создается впечатление, что это маленькая выдержка из кода...
Перед этим: SetLength(Coll^.Coll, lngt); Поставь следующее:
Assert(Coll <> nil, "Coll равен nil");
А перед этим: new(Coll); следующее:
Coll = nil;
И погоняй программу, пока 100 случай не настанет.
Ну и еще много разных способов есть...


 
Serginio   (2003-03-12 12:35) [5]

new(Coll);
Pointer(Coll^.Support):=nil;
Coll^.Support:=15;
Суть в том, что при выделении памяти данные не обнуляются. А компилятор при присвоении проверяет старую ссылку и если она не равна nil пытается вызвать у динамического массива по этому адресу уменьшение количества ссылок, а та как его не существует вызывается исключение.


 
Владислав ©   (2003-03-12 13:49) [6]

> Serginio (12.03.03 12:35)

"Pointer(Coll^.Support):=nil;
Coll^.Support:=15;"

Что то я в смысл "не въехал".
Это зачем делать? Да и Support вообще то integer.
Может проще тогда так:
Coll^.Support:=0;
Coll^.Support:=15;

???


 
icWasya ©   (2003-03-12 14:11) [7]

в смысле
new(Coll);
Pointer(Coll^. Coll):=nil;
Coll^.Support:=15;


 
Владислав ©   (2003-03-12 14:22) [8]

> icWasya © (12.03.03 14:11)
А так?
new(Coll);
Coll^.Coll:=nil;
Coll^.Support:=15;
:)


 
PVOzerski ©   (2003-03-12 14:33) [9]

Я бы сразу после new(Coll) "забивал нулями" Coll^.Coll. Например, так:
new(Coll);
FillChar(Coll^.Coll,sizeof(Coll)-sizeof(Coll^.Support),0);

Тогда бы последующий SetLenght гарантированно не получал бы информации о якобы уже выделенной под "тело" массива памяти.


 
Serginio   (2003-03-12 15:57) [10]

Виноват
...
new(Coll);
Coll^.Support:=15;// или FillChar(Coll^,SizeOf(TMyColl),0);
Pointer(Coll^.Coll):=0;
SetLength(Coll^.Coll, lngt);//Вот здесь и возникает


 
boband   (2003-03-12 22:22) [11]

Спасибо за советы. Мысль о том, что нужно обнулять указатель на динамический массив здравая, но в моем случае к сожалению не работает. Сработала такая фиговина:
new(Coll);
Coll^.Support:=15;
if Coll^.Support=11 then ShowMessage("1")
else ShowMessage("2")
SetLength(Coll^.Coll, lngt);
Правда сами понимаете такое решение никуда не годиться :-(.



Страницы: 1 вся ветка

Текущий архив: 2003.03.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
1-76487
veb
2003-03-11 23:24
2003.03.24
TActionMainMenuBar в MDI приложениях


3-76346
gorv
2003-03-05 18:36
2003.03.24
Convert DBF to CSV


1-76430
[BAD]Angel
2003-03-07 22:50
2003.03.24
Люди, помогите с реестром! (СРОЧНО)


6-76565
Leny
2003-01-27 09:21
2003.03.24
Что значит сообщение...


4-76713
Afolf
2003-01-26 20:23
2003.03.24
Удалить файл