Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.06.14;
Скачать: [xml.tar.bz2];

Вниз

Динамические массивы   Найти похожие ветки 

 
cyber-pilot   (2009-04-24 15:17) [0]

Я использую динамические массивы и часто бывает нужно увеличить его на один элемент и занести в последний элемент какие-нибудь данные. Я делаю это примерно так:


type
 TRec = record
   a: Integer;
   b: Char;
 end;
 TRecList = array of TRec;

var
 vRecList: TRecList;
 vLen: Integer;
begin
//...
 vLen := Length(vRecList);
 SetLength(vRecList, vLen + 1);
 vRecList[vLen].a := 1;
 vRecList[vLen].b := "c";
//...
end;


Можно ли сделать функцию, которая инкрементила бы любой динамический массив и возвращала номер последнего элемента, а лучше сам этот элемент?


 
cyber-vodolaz   (2009-04-24 15:23) [1]

Можно!


 
cyber-pilot   (2009-04-24 15:29) [2]

Как? :)


 
Сергей М. ©   (2009-04-24 15:36) [3]

Можно, не нужно.


> а лучше сам этот элемент


Как ты это себе представляешь ?
Что значит вернуть его элемент, если тип элементов массива заранее неизвестен ?


 
MonoLife ©   (2009-04-24 15:39) [4]

>cyber-pilot  
а справку почитать на счет High()  Low().. length() и т.п..?


 
cyber-pilot   (2009-04-24 15:46) [5]


> Сергей М. ©   (24.04.09 15:36) [3]
> Можно, не нужно.
>
>
> > а лучше сам этот элемент
>
>
> Как ты это себе представляешь ?
> Что значит вернуть его элемент, если тип элементов массива
> заранее неизвестен ?


Я бы хотел примерно такую функцию:
 function IncDinArr(массив; тип элемента массива): тип элемента массива;


 
cyber-pilot   (2009-04-24 15:48) [6]


> MonoLife ©   (24.04.09 15:39) [4]
> >cyber-pilot  
> а справку почитать на счет High()  Low().. length() и т.
> п..?

Читал. Как это относится к теме моего вопроса?


 
Сергей М. ©   (2009-04-24 15:51) [7]

Сначала тебе элемент вернуть надо, теперь тип элемента ..

Ты уж определись что тебе нужно - то ли элемент, то ли его тип) ..


 
cyber-pilot   (2009-04-24 15:59) [8]

Видимо я не правильно выразился, функция должна вернуть именно элемент массива, просто не знаю как это правильно записать.


 
Сергей М. ©   (2009-04-24 16:03) [9]


> функция должна вернуть именно элемент массива


Чтобы она чего-то тебе вернула, нужно чтобы в декларации ф-ции

function MyFunc(хрен знает что за массив): TТипРезультата;

Вот я и задаю вопрос - что ты собрался писать вместо TТипРезультата ?


 
MBo ©   (2009-04-24 16:03) [10]


type
 TIntArr = array of Integer;
var
 A: TIntArr;
 L: integer;
begin
 L := 5;
 DynArraySetLength(Pointer(A), TypeInfo(TIntArr), 1, @L);
 Caption := IntToStr(Length(A));


удовольствие небольшое, однако...


 
MBo ©   (2009-04-24 16:04) [11]

А зачем все это нужно?


 
Сергей М. ©   (2009-04-24 16:09) [12]


> удовольствие небольшое, однако.


Можно сказать - вообще никакого)


> TypeInfo(TIntArr)


Тип известен на этапе компиляции


 
MBo ©   (2009-04-24 16:20) [13]

>Можно сказать - вообще никакого)

Это я пытаюсь понять, что автор хочет, и какие он желает извлечь полезности :)

Например, желание возврата элемента массива, которому только что присвоили значение - тонкий изврат, imho


 
cyber-pilot   (2009-04-24 16:37) [14]


> MBo ©   (24.04.09 16:04) [11]
> А зачем все это нужно?


Это нужно для сокращения кода. Вместо этого:


type
TRec = record
  a: Integer;
  b: Char;
end;
TRecList = array of TRec;

var
vRecList: TRecList;
vLen: Integer;
begin
//...
vLen := Length(vRecList);
SetLength(vRecList, vLen + 1);
vRecList[vLen].a := 1;
vRecList[vLen].b := "c";
//...
end;


писать вот так:

type
TRec = record
  a: Integer;
  b: Char;
end;
TRecList = array of TRec;

var
vRecList: TRecList;
begin
//...
with IncDinArr(vRecList) do
begin
  a := 1;
  b := "c";
end;
//...
end;


Мне кажется так будет удобнее. Хотя может быть я и извращенец :)


 
Юрий Зотов ©   (2009-04-24 16:52) [15]

function IncDinArr(RecList: TRecList): TRec;
begin
 SetLength(RecList, Length(RecList) + 1);
 Result = RecList[High(RecList)]
end;

===================

with IncDinArr(vRecList) do
begin
 a := 1;
 b := "c";
end;


 
Denis__ ©   (2009-04-24 16:55) [16]

Код не сократился... там где было 4 строки, теперь 5. В чем прикол этой затеи?


 
cyber-pilot   (2009-04-24 17:04) [17]


> Юрий Зотов ©   (24.04.09 16:52) [15]

Смысл был в том, чтобы это работало для любого динамического массива.


> Denis__ ©   (24.04.09 16:55) [16]

Ты смотришь ввысь, а я вширь :)


 
Юрий Зотов ©   (2009-04-24 17:08) [18]

> cyber-pilot   (24.04.09 17:04) [17]

> Смысл был в том, чтобы это работало для любого динамического массива.

Увеличить длину можно. Но результат КАКОГО типа должна возвращать такая функция? Вот этот самый Ваш with - он с ЧЕМ работать должен? И как это объяснить компилятору?


 
cyber-pilot   (2009-04-24 17:14) [19]


> Юрий Зотов ©   (24.04.09 17:08) [18]
> Увеличить длину можно. Но результат КАКОГО типа должна возвращать
> такая функция? Вот этот самый Ваш with - он с ЧЕМ работать
> должен? И как это объяснить компилятору?


Да, собственно, это я и хотел узнать.


 
Sapersky   (2009-04-24 17:14) [20]

Можно ли сделать функцию, которая инкрементила бы любой динамический массив и возвращала номер последнего элемента, а лучше сам этот элемент?

Ну посмотри это (Arr_AddItem, на базе того же DynArraySetLength):
http://sapersky.narod.ru/files/Arrays.rar
Хотя мне самому оно не очень нравится, по 5 параметров в функцию загонять - громоздко... но если делать для массива некую обёрточную структуру (чтобы хранить TypeInfo/Count), пропадёт возможность обращения к элементам без тайпкаста.

В D2009 можно ещё попробовать дженерики.


 
Юрий Зотов ©   (2009-04-24 17:21) [21]

Можно извратиться примерно так (массив должен быть packed):

function IncDinArr(Arr: Pointer; Info: PTypeInfo): Pointer;
begin
 ... // См. [10]
 // Теперь, зная адрес массива, его длину Len и размер элемента Size,
 // вычисляем адрес последнего элемента:
 Result = Pointer((Cardinal(Arr) + Len*Size))
end;

===================

// И остается только привести тип указателя:
with PRec(IncDinArr(vRecList, ...))^ do
begin
a := 1;
b := "c";
end;


 
cyber-pilot   (2009-04-24 17:32) [22]

Всем спасибо!


 
жж   (2009-04-24 19:52) [23]

Предполагаю, что автор ветки не в курсе существования TList"а, который и решил бы проблему



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

Форум: "Начинающим";
Текущий архив: 2009.06.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
15-1239189575
VoznikVopros
2009-04-08 15:19
2009.06.14
Как перенести компоненты InterBase без потери функциональности?


3-1222175692
SergP
2008-09-23 17:14
2009.06.14
Oracle. Insert


15-1239089792
Немо
2009-04-07 11:36
2009.06.14
Как вытащить проводки из сетевого кабеля? (витая пара)


2-1240598283
buzb
2009-04-24 22:38
2009.06.14
Вопрос о Drag-n-Drop


2-1240863513
ForeverStudent
2009-04-28 00:18
2009.06.14
Фильтрация данных





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