Форум: "Начинающим";
Текущий архив: 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