Главная страница
    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.012 c
2-1143984013
bogdan
2006-04-02 17:20
2006.04.23
задача на перебор


3-1140673919
vlgrig1961
2006-02-23 08:51
2006.04.23
Портятся индексы как с этим бороться


15-1144215311
Ega23
2006-04-05 09:35
2006.04.23
КБД 2006 - уже на следующей неделе.


1-1140177437
Дмитрий_177
2006-02-17 14:57
2006.04.23
Свой курсор в программе


2-1143793505
RTV
2006-03-31 12:25
2006.04.23
StringGrid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский