![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание динамического массива [D6, Win2k, WinXP]
Armageddon © (2002-12-27 17:55:00)Раскажите пожалуйста, как создать динамический массив и как с ним работать.(Я знаю, что в Delphi он уже есть, но мне именно нужен свой).
PVOzerski (2002-12-28 20:37:00) [1]Есть очень полезная RTL-функция ReallocMem. В сочетании с GetMem идеально подходит, когда "штатных" динамических массивов нет (напр., в D2-3).
type
tx=array[1..1] of integer;
var
x:^tx;
i:integer;
begin
Getmem(x,100*sizeof(x[1]));
for i:=1 to 100 do
x[i]:=i;
ReallocMem(x,200*sizeof(x[1]));
for i:=101 to 200 do
x[i]:=-i;
ReallocMem(x,0);
end.
TTCustomDelphiMaster (2002-12-28 20:37:00) [2]MyType = record
...
end;
PMyType = ^MyType
var
a: array of PMyType;
...
SetLength(a, 100);
New(a[1]);
...
Dispose(a[1]);
Fantasist (2002-12-28 20:23:00) [3]Эх, по видимому, что запостенно в этом форуме более месяца назад теряется безвозвратно.
Например:
TDynArray=class
private
mData:pointer;
function Get(Index:integer):Integer;
begin
Result:=PInteger(Cardinal(mData)+Index*SizeOf(Integer))^;
end;
procedure Set(Index:Integer;Value:Integer)
begin
PInteger(Cardinal(mData)+Index*SizeOf(Integer))^:=Value;
end;
public
constructor Create(Size:integer)
begin
GetMem(mData,*SizeOf(Integer));
end;
destructor Destroy; override;
begin
FreeMem(mData);
end;
public
property Items[Index:integer]:Integer read Get write Set; default;
end;
Дальше - ваша фантазия. Расширять, улучшать можно много.
KSergey (2002-12-28 20:17:00) [4]Тогда при чем тут "нижний" уровень? Создавайт нормальный динамическй массив p[1..10000000000000000] -и все.
Только не спрашивайте, почему массив такого размера не создается - он просто не лезет в память. Используйте другие средства (если вы перечислине их через new - проблему это не решит)
Armageddon (2002-12-28 15:22:00) [5]gsu спасибо конечно, но проблема в другом, как изменять P
тоесть мне необходимо создать P1,p2,p3,p4 ... P10000000000000000.
Вот в чем проблема, не буду же я их вручную перечислять
gsu (2002-12-28 14:11:00) [6]New(var P: Pointer) - динамически выделяет память, размер которой определяется типом типизированного указателя P, и возвращает P адрес выделенной области памяти. Отсюда и пляши.
Armageddon (2002-12-28 14:01:00) [7]Че никто не знает???
Armageddon (2002-12-28 01:08:00) [8]Всем большое спасибо. Вы мне очень помогли. В продолжении темы, а как создать массив на немного более низком уровне. Есть команды new(P1); b т.д. Я не могу понять, как сделать так, чтобы создать трубуемое кол-во (как изм P1). А потом как ссылаться .
Всем зарание благодарен.
Kotka (2002-12-27 22:58:00) [9]a: array of integer;-это одномерный массив
a: array of array of integer;-а так двумерный
SetLength(a,5,2);
OxOTHuK (2002-12-27 22:21:00) [10]а FINALIZE обязательно??
Roma (2002-12-27 18:58:00) [11]Armageddon © (27.12.02 17:55)
Можешь попробовать вариантные массивы, создание - VarArrayCreate, остальные функции смотри в "See also" к VarArrayCreate...
gsu (2002-12-27 18:03:00) [12]Что значит есть и нужен свой, это ж не компонент
1. объявляешь: a: array of TТвойТипДанных
2. Выделяешь под него память SetLenght(a, Твоя длина)
3. Работаешь с ним
4 Удаляешь его SetLenght(a,0) или a:=nil
Cu (2002-12-27 18:01:00) [13]array of [type]
for example :
a: array of integer;
SetLength (a, 5);
a [0] := ...;
...
a [4] := ...;
....
Finalize (a);
что -то типа того...