type general_attribute = class
x:integer;
str_1:string;
str_2:integer;
str_3:integer;
str_4:integer;
str_5:integer;
end;
type
tarray = array [0..maxarraysize] of general_attribute;
parray = ^tarray;
tdynarray = object
p:parray;
count: integer;
constructor create(acount: integer);
procedure setcount(acount: integer);
procedure reset;
destructor destroy;
end;
implementation
constructor tdynarray.create(acount: integer);
begin
p:=nil;
count := 0;
setcount(acount);
end;
procedure tdynarray.setcount(acount: integer);
var
np: parray;
x: integer;
begin
if count = acount then exit;
if p = nil then
begin
if acount <= 0 then
begin
count := 0;
end else
begin
//for x:=0 to acount do
begin
getmem(p, acount * sizeof(general_attribute));
fillchar(p^, acount * sizeof(general_attribute), 0);
end;
count := acount;
end;
end; //else
begin
if acount <= 0 then
begin
for x:=0 to acount do
begin
freemem(p, count * sizeof(general_attribute));
count := 0;
end;
end else
begin
begin
getmem(np, acount * sizeof(general_attribute))
if acount > count then
begin
move(p^, np^, count * sizeof(general_attribute));
fillchar(np^[count], (acount - count) * sizeof(general_attribute),0);
end else
begin
move(p^, np^, acount * sizeof(general_attribute));
end;
freemem(p, count * sizeof(general_attribute));
p:= np;
count := acount;
end;
end;
end;
end;
procedure tdynarray.reset;
begin
fillchar(p^, count * sizeof(general_attribute), 0);
end;
destructor tdynarray.destroy;
begin
setcount(0);
end;
Динамический массив структуры
возможно делаю большую глупость, с указателями "общаюсь на ВЫ". динамические массивы ток начал читать.
*********************************
есть следующий модуль:
Код:
код выдрал из инета.
у меня имеется переменная test:tdynarray;
я создаю элемент test.create(1);
далее мне нужно перезаписать например параметр x, пишу test.p[0].x:=1; получается борода) понимаю. возможно глупо записать параметр x если у меня нет к нему адреса. делаю следующее:
создаю переменную типа y:=general_attribute; , задаю отдельно параметры каждому атрибуту и присваиваю её test.p[0]:=y; - все срабатывает. но после завершения программы выдает ошибку. хотя память освобождаю при закрытии формы.
плиз хелп ми.
Код:
MyArray: array of general_attribute
Цитата:
Для добавления необходимо выполнить SetLength(N+1)
setlength(N) насколько я знаю удаляет все предшествующие значения. решил проверить, прежде чем делать выводы - компилятор заявляет об ошибке.
тогда выходит что во время выполнения программы мне нужно заранее знать количество элементов в массиве. мне же нужно увеличивать количество элементов по надобности. или же создавать еще массив для временного хранения данных. по мне проще было бы сделать указатель и освобождать память по мере необходимости.
Цитата:
Вообще для таких целей в Delphi лучше использовать что то, вроде TCollection...
вот про TCollection сенкс. погрызу гранит науки)
собственно все равно не могу понять суть. почему я в своем коде получаю указатель на i-ый элемент массива в котором 1 ячейка хранит данные созданные мной, но память к любому из под-элементов не освобождена. может дело в string?
Код:
uses
SysUtils;
type
TData = class
Data: integer;
constructor Create(D:Integer);
end;
TDataArr=Array of TData;
var
i:integer;
NOld:integer=10;
NNew:Integer=15;
NTrunc:Integer=12;
Arr:TDataArr;
constructor TData.Create(D: Integer);
begin
Data:=D;
end;
procedure PrintArray(P:TDataArr; Count:Integer);
var
i:integer;
begin
for i:=0 to Count-1 do write(P.Data,' ');
writeln;
end;
begin
SetLength(Arr,NOld);
for i:=0 to NOld-1 do
begin
Arr:=TData.Create(i+1);
end;
PrintArray(Arr,NOld);
SetLength(Arr,NNew);
for i:=NOld to NNew-1 do
begin
Arr:=TData.Create(i+1);
end;
PrintArray(Arr,NNew);
SetLength(Arr,NTrunc);
PrintArray(Arr,NTrunc);
readln;
end.
SysUtils;
type
TData = class
Data: integer;
constructor Create(D:Integer);
end;
TDataArr=Array of TData;
var
i:integer;
NOld:integer=10;
NNew:Integer=15;
NTrunc:Integer=12;
Arr:TDataArr;
constructor TData.Create(D: Integer);
begin
Data:=D;
end;
procedure PrintArray(P:TDataArr; Count:Integer);
var
i:integer;
begin
for i:=0 to Count-1 do write(P.Data,' ');
writeln;
end;
begin
SetLength(Arr,NOld);
for i:=0 to NOld-1 do
begin
Arr:=TData.Create(i+1);
end;
PrintArray(Arr,NOld);
SetLength(Arr,NNew);
for i:=NOld to NNew-1 do
begin
Arr:=TData.Create(i+1);
end;
PrintArray(Arr,NNew);
SetLength(Arr,NTrunc);
PrintArray(Arr,NTrunc);
readln;
end.
вывод:
Код:
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 2 3 4 5 6 7 8 9 10 11 12
Array of smth