Форум: "Основная";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];
Внизмассив tstringlist Найти похожие ветки
← →
Мыш (2003-03-01 20:35) [0]А почему такой код не работает?
--------------------------------------------------------------
type tinfo=record
a,t,u:tstringlist;
end;
var
Form1: TForm1;
info:array of tinfo;
infocount:integer
procedure TForm1.InfoCreate(Count:integer);
var
i:integer;
begin
setLength(info,count);
for i := 0 to count do
begin
info[i].A:=tstringlist.Create;
info[i].T:=tstringlist.Create;
info[i].U:=tstringlist.Create;
end;
infocount:=count;
end;
procedure TForm1.InfoFree();
var
i:integer;
begin
for i := 0 to infocount do
begin
info[i].A.Free;
info[i].T.Free;
info[i].U.Free;
end;
setLength(info,0);
end;
--------------------------------------------------------------
В строке
--------------------------------------------------------------
info[i].T.Free;
--------------------------------------------------------------
выдает access violation при значении i=0
хотя
--------------------------------------------------------------
info[i].a.Free;
--------------------------------------------------------------
при том же проходе, когда i=0
освобождает нормально
, не понимаю, ведь я создал этот stringlist?
← →
jack128 (2003-03-01 20:44) [1]procedure TForm1.InfoCreate(Count:integer);
var
i:integer;
begin
setLength(info,count);
for i := 0 to count - 1 do
begin
info[i].A:=tstringlist.Create;
info[i].T:=tstringlist.Create;
info[i].U:=tstringlist.Create;
end;
infocount:=count;
end;
← →
Anatoly Podgoretsky (2003-03-01 20:53) [2]for i := 0 to count do/for i := 0 to infocount do ->
for i := Low(info) to High(info) do
← →
Мыш (2003-03-01 21:12) [3]2jack128: я намеренно пишу count, зачем же мне передавать в процедуру значение большее на единицу, а потом в процедуре же его уменьшать на единицу? так и запутаться не долго.
К тому же создание как бы проходит без ошибок, а передаю я число 2, то есть, по идее создается 3 элемента массива info
---------------------------------------------------------------
info[0]
info[1]
info[2] (проверено трассировкой)
---------------------------------------------------------------
Там же переменной infocount присваивается значение 3
Да, в процедуре infofree есть ошибка, там нужно писать
---------------------------------------------------------------
for i := 0 to infocount-1 do
---------------------------------------------------------------
а не
---------------------------------------------------------------
for i := 0 to infocount do
---------------------------------------------------------------
Но дело в том, что ошибка происходит на НУЛЕВОМ элементе (i=0), уже созданном, причем ВО ВТОРОЙ строке, когда освобождение
списка
---------------------------------------------------------------
[0].A
---------------------------------------------------------------
проходит нормально
а освобождение списка
---------------------------------------------------------------
[0].t
---------------------------------------------------------------
Выдает ошибку доступа
2Anatoly Podgoretsky:
Простите, но я не понял, что Вы имели в виду, можно поподробнее?
А вот эта процедура, запущенная после создания всех элементов
Выдает окно "программа выполнила недопустимую операцию.."
Хотя, если запустить ее до запуска процедуры infocreate, то все нормально, выплывает сообщение "0 -1"
---------------------------------------------------------------
procedure TForm1.Button5Click(Sender: TObject);
begin
Showmessage(floatToStr( low(info))+" "+floatToStr( high(info)));
end;
---------------------------------------------------------------
← →
jack128 (2003-03-01 21:21) [4]Функции Low & High возврощают соответственно нижнию и верхнию границу массива.
Ты пишешь setLength(info,count); - значит у тя count элемнтов, индексация начинается с нуля следовательно индекс последнего элемента Count - 1.
Хотя Anatoly Podgoretsky © (01.03.03 20:53) указал на самый коректный вариант.
← →
Мыш (2003-03-01 22:06) [5]Спасибо, вы правы, а дело было в моей невнимательности.
← →
Anatoly Podgoretsky (2003-03-01 23:54) [6]Мыш (01.03.03 21:12)
К тому же создание как бы проходит без ошибок, а передаю я число 2, то есть, по идее создается 3 элемента массива info
Нет твоя идея неверная, если передаешь 2 то и создается 2 SetLenght(info, count), а вот индексироваться пытаешься по трем 0, 1, 2
так и запутаться не долго.
Вот ты и запутался, странная логика передаем два, а в уме считаем три.
2Anatoly Podgoretsky:
Простите, но я не понял, что Вы имели в виду, можно поподробнее?
Это значит что цикл идет по реально созданному массиву, в твоем примере 0 то 1 (два элемента)
А вот эта процедура, запущенная после создания всех элементов
Выдает окно "программа выполнила недопустимую операцию.."
В связи с путаниецей у тебя происходит порча памяти, возможно во многих вещах, ты еще легко отделался, могло быть и хуже, до полного подвещивания системы и или до перезагрузки.
← →
Anatoly Podgoretsky (2003-03-01 23:59) [7]Еще совет-аргумент в пользу Low/High у тебя Count отвязан от действительного размера массива и может не соответствовать, всегда надо использовать более безопасные методы, а использование внешней автономной переменной опасно, сменишь в одном месте ее значение или размер массива и получишь хук слева.
Low/High/Length работают с дейсвительностью.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c