Главная страница
    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.063 c
14-39557
Delirium
2003-02-26 17:50
2003.03.13
Доменное имя первого уровня - даром !


3-39151
Glory
2003-02-20 14:51
2003.03.13
Настроить BDE для работы с файлами FoxPro


14-39550
Beginner N1024
2003-02-19 01:05
2003.03.13
Как открыть в D5 проект, написанный в D7


14-39471
Шишкин Илья
2003-02-27 10:13
2003.03.13
Что означает слово IMHO?


14-39582
IM
2003-02-26 19:24
2003.03.13
Проблемы с оладчиком (Delphi5)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский