Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.013 c
1-1141624759
Fuel
2006-03-06 08:59
2006.04.23
Скорость добавления


2-1143556598
коробас
2006-03-28 18:36
2006.04.23
Строки


2-1144427429
Volodya_
2006-04-07 20:30
2006.04.23
COM port


1-1142858068
nastya
2006-03-20 15:34
2006.04.23
объявить константы в TypeLibrary


2-1144651711
Locke
2006-04-10 10:48
2006.04.23
как сохраить рисунок с канвы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский