![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В динамическом массиве структур - динмчс. массив: возможно ли? [D5, WinME]
BorisKb © (2002-12-19 10:04:00)type
SumKod=Record
kod: Integer;
naim: String;
SumMesKod: Array of Currency;
end;
Var Nac: Array of SumKod;
Кто-нибудь работал с такой конструкцией? В принципе возможно?
Как только делаю: SumMesKod: Array[1..10] of Currency - все проходит отлично. А с динамическим массивом в динамическом массиве структур (записей) - постоянно гроблю память.
Код не привожу сознательно, меня интересует принципиальная возможность и особенности работы с такой конструкцией(если есть таковые).
Благодарю за сотрудничество.
icWasya (2002-12-19 11:44:00) [1]а по поводу утечки памяти посмотрите реализацию TStringList -
там за каждым элементом стоит структура
record
S:String;
O:TObject;
end;
то есть не динамический массив, а строка, но если неаккуратно работать, то будут возникать проблемы с памятью.
Посмотрите, как реализуются изменение длины списка, удаление элементов, обмен ...
zavdim (2002-12-19 10:38:00) [2]length(Nac);
length(Nac[i].SumMesKod);
for i :=0 to Pred(length(Nac)) do Nac[i].......
BorisKb (2002-12-19 10:28:00) [3]Код от AlexSV не совсем корректен в моем случае. Я до последней считанной записи не знаю ни кол-ва записей ни кол-ва элементов массивов в этих записях.
NailS (2002-12-19 10:16:00) [4]
> BorisKb ©
Может стоит присмотрется к TList?
Просто в моей практике необходимость в динамическом массиве возникала только при работе с бинарными данными, в остальных случаях удобней было использовать TList
BorisKb (2002-12-19 10:16:00) [5]Благодарю еще раз. Значит это мои старческие, толи глаза, толи мозги не видят чего-то. Буду смотреть :)
AlexSV (2002-12-19 10:16:00) [6]> ... В принципе возможно?
Да.
procedureInitRec;
var
SizeSumMesKod, SumMesKodID : integer;
begin
SizeSumMesKod := 10;
new(SumKod);
withSumKod do begin
kod := 1;
naim := "naim1";
SetLength(SumMesKod, SizeSumMesKod);
forSumMesKodID := 0 toSizeSumMesKod - 1 do
SumMesKod[SumMesKodID] := <ValueOfCurrency>;
end;
end;
Только при освобождении памяти записи необходимо освобождать и динамический массив.
Skier (2002-12-19 10:15:00) [7]>BorisKb
Почитай про SetLength(...) и Finalize(...)
zavdim (2002-12-19 10:09:00) [8]ну я работал.
работать надо, конечно, аккуратно и лучше типы все-таки с буквы T начинать.
То есть - принципиальная возможность есть. Дальше не говорю сознательно - не знаю почему (противоречие однако).