Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.23;
Скачать: CL | DM;

Вниз

New   Найти похожие ветки 

 
Quattro ©   (2006-04-09 21:03) [0]

Добрый вечер. Подскажите, пожалуйста, есть ли какая нибудь процедура для динамического выделения памяти под массив, аналогичная new[Size] в С++??


 
Джо ©   (2006-04-09 21:09) [1]

SetLength (Дин_массив, размер)


 
Palladin ©   (2006-04-09 21:10) [2]

1.
есть понятие динамического массива

Type
TMyRec=Record
  n:integer;
  s:String;
Endl
Var
a:Array of TMyRec;

Begin
SetLength(a,10);
End;

2
есть глубокоуважаемый GetMem

Type
TMyRec=Record
  n:integer;
  s:String;
Endl
Var
a:^TMyRec;

Begin
GetMem(a,SizeOf(TMyRec)*10);
End;


 
Radagast   (2006-04-09 21:10) [3]

в var пишете просто x:array of integer/real/... т.е. без указания границ
в основном тексте
setlength(<переменная массива>,<сколько новых ячеек выделить>);
afaik динамические массивы работают медленнее, чем статические.


 
Palladin ©   (2006-04-09 21:12) [4]

но, естественно, GetMem ниразу не уважаемый если не спарен с FreeMem, если их спарить будет счасте (доступное не многим, но некоторым :) )...


 
Джо ©   (2006-04-09 21:39) [5]

> (доступное не многим, но некоторым :) )...

Из тех, кто достоин! 8-)


 
begin...end ©   (2006-04-09 22:03) [6]

> Palladin ©   (09.04.06 21:10) [2]

В данном случае GetMem лучше не применять. Потому что после GetMem потребуется вручную обнулить строковые поля (иначе может быть ошибка, даже если просто вызвать для них SetLength), а перед FreeMem — вручную финализировать их (иначе будет утечка памяти).


 
Palladin ©   (2006-04-09 22:12) [7]

согласен, упущение, но для начала понимания смысла GetMem достаточно


 
Quattro ©   (2006-04-10 14:03) [8]

Добрый день....все же интересно разобраться, как выделить память под массив с помощью New/GetMem...допустим объявил я свой класс вот так..для начала хочу сделать просто массив целых чисел величиной Size...в данном примере Size будет равно 10

type

TMyArray = class
private
public
 Constructor Create(Size:Integer);
 Destructor Destroy;override;
end;

PMyArray:^TMyArray

var
 MyArr:PMyArray;

Implementation

Constructor TMyArray.Create(Size:Integer);
begin
 GetMem(PMyArr,SizeOf(Int)*10);
end;

Это делается вот так?:)


 
Плохиш ©   (2006-04-10 14:12) [9]


> TMyArray = class

Это не массив


 
Сергей М. ©   (2006-04-10 14:16) [10]


> Это делается вот так?


Нет, не так.

type

TMyArray = class
private
public
Constructor Create(Size:Integer);
Destructor Destroy;override;
end;

PMyArray:^TMyArray

var
MyArr:PMyArray;

Implementation

Constructor TMyArray.Create(Size:Integer);
begin
GetMem(PMyArr,SizeOf(TMyArray)*10);
end;


 
Джо ©   (2006-04-10 14:18) [11]

> [10] Сергей М. ©   (10.04.06 14:16)

Позабавило, спасибо :)


 
Плохиш ©   (2006-04-10 14:20) [12]


> Сергей М. ©   (10.04.06 14:16) [10]

O, ты знаешь что-такое PMyArr 8-O Снимаю шляпу ;-)


 
Сергей М. ©   (2006-04-10 14:27) [13]


> Джо ©   (10.04.06 14:18) [11]


> Плохиш ©   (10.04.06 14:20) [12]


Не опис..тесь от восторга)

С тем же удовольствием могла бы быть приведена строчка

GetMem(PMyArr,SizeOf(PMyArray)*10);

но ума автору она вряд ли добавила бы.


 
Плохиш ©   (2006-04-10 15:01) [14]


> Сергей М. ©   (10.04.06 14:27) [13]

Не серчай :-)

Автор говорит о массивах целых чисел, после чего приводит какой-то код, в котором массивы на упоминаются, но используются неизвестные переменная PMyArr и то ли переменная, то ли тип Int. Ты предлагаешь ему заменить эту Int на T(P)MyArray. Из этого я сделал вывод, что тебе известно, что это за PMyArr. Поэтому и снял шляпу, я так до сих пор и не понял, что это такое.


 
Сергей М. ©   (2006-04-10 15:40) [15]


> Автор говорит о


У автора в голове - полная каша.


 
Quattro ©   (2006-04-10 16:55) [16]

Прошу особо не серчать :)..я не волшебник, я только учусь:)....я  написал не совсем то, что хотел..:)..временное помутнение рассудка ,видимо:)...может быть вот так?

type

TMyArray = class
private
Arr: array of integer;
PArr: ^Arr;
public
Constructor Create(Size:Integer);
Destructor Destroy;override;
end;

Implementation

Constructor TMyArray.Create(Size:Integer);
begin
GetMem(PArr,SizeOf(Integer)*10);
end;


Я хочу попытаться сделать динамическое выделение памяти под массив, аналогично конструкции

int *Arr = new int[10];

в С++  не используя при этом SetLength. Но не получается, поэтому прошу помощи у Вас, Уважаемые Мастера.


 
Quattro ©   (2006-04-10 16:58) [17]

Извините, ошибся..думаю, что вот так

type

TMyArray = class
private
Arr: array of integer;
PArr: ^Integer;
public
Constructor Create(Size:Integer);
Destructor Destroy;override;
end;

Implementation

Constructor TMyArray.Create(Size:Integer);
begin
GetMem(PArr,SizeOf(Integer)*10);
end;


 
Amoeba ©   (2006-04-10 17:04) [18]


> Quattro ©   (10.04.06 16:58) [17]
> Извините, ошибся..думаю, что вот так

Тот же бред. Почитай хотя бы в справке, но лучше в учебнике, про динамические массивы.

Если массив динамический, а поле Arr является таковым, то только SetLength, и никаких GetMem.

PArr: ^Integer; - тоже чушь! Зачем оно нужно - указатель на указатель!


 
Quattro ©   (2006-04-10 17:38) [19]

неужели возможен только такой вариант?

type
TMyIntArray = class
private
 Size:Integer;
public
 Arr:array of integer;
 Constructor Create(_Size:Integer);
 Destructor Destroy;override;
end;

implementation

{ MyIntArray }

constructor TMyIntArray.Create(_Size:Integer);
begin
 Size:=_Size;
 SetLength(Arr,_Size);
end;

destructor TMyIntArray.Destroy;
begin

 inherited;
end;



 
icWasya ©   (2006-04-10 18:06) [20]

>Quattro ©   (10.04.06 17:38) [19]
неужели возможен только такой вариант?
Вообще говоря это правильно. А если не можешь жить без GetMem/FreeMem, то так


type
 TIntegerArray = array [0..0] of integer;
 PIntegerArray =^TIntegerArray;
TMyIntArray = class
private
FSize:Integer; // <-==
procedure SetSize(NewSize:Integer);
public
Arr:PIntegerArray;
Constructor Create(_Size:Integer);
Destructor Destroy;override;
property Size:Integer read FSize write SetSize;
end;

implementation

{ MyIntArray }

constructor TMyIntArray.Create(_Size:Integer);
begin
FSize:=_Size;
GetMem(Arr,SizeOf(Integer)*FSize);
end;

destructor TMyIntArray.Destroy;
begin
FreeMem(Arr);
inherited;
end;

procedure TMyIntArray.SetSize(NewSize:Integer);
begin
 if NewSize=FSize then Exit;
 ReallocMem(Arr,SizeOf(Integer)*(NewSize-FSize));
 FSize:=NewSize;
end;



Страницы: 1 вся ветка

Текущий архив: 2006.04.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.033 c
1-1142544581
Roll
2006-03-17 00:29
2006.04.23
Как сохранить данные...


1-1142103774
Fenix
2006-03-11 22:02
2006.04.23
Подсветка синтаксиса в RichEdit


15-1144171350
cleric
2006-04-04 21:22
2006.04.23
Эвольвента


4-1139054418
MyCola
2006-02-04 15:00
2006.04.23
Сигнализация для мышки и клавы


15-1143789835
vagra
2006-03-31 11:23
2006.04.23
Знатокам: В какую гос. структуру жаловаться?