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

Вниз

массив 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
1-39366
td
2003-03-02 14:00
2003.03.13
Перенос строки


1-39244
Kair
2003-03-02 21:32
2003.03.13
Поверхность формы


3-39166
Леший_
2003-02-20 17:04
2003.03.13
День добрый. Подскажите пожалуйста.


3-39154
wildcow
2003-02-20 14:33
2003.03.13
SQL и нити


7-39598
ksa3003
2003-01-15 10:01
2003.03.13
Проблема с Модемом