Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание динамического массива [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);

что -то типа того...


Наверх

Титульная страница Поиск, карта сайта Написать письмо