Форум: "Начинающим";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.012 c