![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
New [D7, XP]
Quattro © (2006-04-09 21:03:00)Добрый вечер. Подскажите, пожалуйста, есть ли какая нибудь процедура для динамического выделения памяти под массив, аналогичная new[Size] в С++??
icWasya (2006-04-10 18:06:00) [1]>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;
Quattro (2006-04-10 17:38:00) [2]неужели возможен только такой вариант?
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;
Amoeba (2006-04-10 17:04:00) [3]
> Quattro © (10.04.06 16:58) [17]
> Извините, ошибся..думаю, что вот так
Тот же бред. Почитай хотя бы в справке, но лучше в учебнике, про динамические массивы.
Если массив динамический, а поле Arr является таковым, то только SetLength, и никаких GetMem.
PArr: ^Integer; - тоже чушь! Зачем оно нужно - указатель на указатель!
Quattro (2006-04-10 16:58:00) [4]Извините, ошибся..думаю, что вот так
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;
Quattro (2006-04-10 16:55:00) [5]Прошу особо не серчать :)..я не волшебник, я только учусь:)....я написал не совсем то, что хотел..:)..временное помутнение рассудка ,видимо:)...может быть вот так?
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. Но не получается, поэтому прошу помощи у Вас, Уважаемые Мастера.
Сергей М. (2006-04-10 15:40:00) [6]
> Автор говорит о
У автора в голове - полная каша.
Плохиш (2006-04-10 15:01:00) [7]
> Сергей М. © (10.04.06 14:27) [13]
Не серчай :-)
Автор говорит о массивах целых чисел, после чего приводит какой-то код, в котором массивы на упоминаются, но используются неизвестные переменная PMyArrи то ли переменная, то ли тип Int. Ты предлагаешь ему заменить эту Intна T(P)MyArray. Из этого я сделал вывод, что тебе известно, что это за PMyArr. Поэтому и снял шляпу, я так до сих пор и не понял, что это такое.
Сергей М. (2006-04-10 14:27:00) [8]
> Джо © (10.04.06 14:18) [11]
> Плохиш © (10.04.06 14:20) [12]
Не опис..тесь от восторга)
С тем же удовольствием могла бы быть приведена строчка
GetMem(PMyArr,SizeOf( PMyArray)*10);
но ума автору она вряд ли добавила бы.
Плохиш (2006-04-10 14:20:00) [9]
> Сергей М. © (10.04.06 14:16) [10]
O, ты знаешь что-такое PMyArr 8-O Снимаю шляпу ;-)
Джо (2006-04-10 14:18:00) [10]> [10] Сергей М. © (10.04.06 14:16)
Позабавило, спасибо :)
Сергей М. (2006-04-10 14:16:00) [11]
> Это делается вот так?
Нет, не так.
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:12:00) [12]
> TMyArray = class
Это не массив
Quattro (2006-04-10 14:03:00) [13]Добрый день....все же интересно разобраться, как выделить память под массив с помощью 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;
Это делается вот так?:)
Palladin (2006-04-09 22:12:00) [14]согласен, упущение, но для начала понимания смысла GetMem достаточно
begin...end (2006-04-09 22:03:00) [15]> Palladin © (09.04.06 21:10) [2]
В данном случае GetMem лучше не применять. Потому что после GetMem потребуется вручную обнулить строковые поля (иначе может быть ошибка, даже если просто вызвать для них SetLength), а перед FreeMem — вручную финализировать их (иначе будет утечка памяти).
Джо (2006-04-09 21:39:00) [16]> (доступное не многим, но некоторым :) )...
Из тех, кто достоин! 8-)
Palladin (2006-04-09 21:12:00) [17]но, естественно, GetMem ниразу не уважаемый если не спарен с FreeMem, если их спарить будет счасте (доступное не многим, но некоторым :) )...
Radagast (2006-04-09 21:10:00) [18]в var пишете просто x:array of integer/real/... т.е. без указания границ
в основном тексте
setlength(<переменная массива>,<сколько новых ячеек выделить>);
afaik динамические массивы работают медленнее, чем статические.
Palladin (2006-04-09 21:10:00) [19]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;
Джо (2006-04-09 21:09:00) [20]SetLength (Дин_массив, размер)