Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
7-39596
MAXXim
2003-01-16 20:19
2003.03.13
Монитор


4-39630
Arkady
2003-01-22 13:58
2003.03.13
Имя EXE-файла по Handle окна


3-39239
werus
2003-02-20 23:26
2003.03.13
Доступ к Ораклу


4-39641
AlexG
2003-01-21 07:13
2003.03.13
В WinApi приложении выходит такая ошибка не могу понять почему


1-39372
ЮРИЙ_К
2003-02-28 17:17
2003.03.13
Как обратиться к Item и SubItem компонента ListView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский