Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизЗагрузить одним махом несколько динамических массивов. Найти похожие ветки
← →
Дмитрий С © (2012-05-16 13:04) [0]Знатоки внутренностей дельфи, подскажите, как загрузить массив динамических массивов из файла одним махом (предварительно файл в нужном формате, конечно, подготовлю)?
К примеру есть тип
TSomeDynArray = array of record {......} end;
надо загрузить из файла переменную
A: array of TSomeDynArray
← →
oldman © (2012-05-16 13:18) [1]
> одним махом
типа loadfromfile? вряд-ли.
придется писать процедуру загрузки из нескольких строк.
← →
Омлет © (2012-05-16 13:20) [2]Никак. Только по отдельности каждый подмассив, т.к. длина их не одинакова.
← →
oxffff © (2012-05-16 13:21) [3]Как в файле идет разделение по первой границе(по внешнему массиву)?
Что это за признак?
← →
oxffff © (2012-05-16 13:22) [4]Предварительно конечно [2]. Но можно подумать как красиво обернуть.
← →
Ega23 © (2012-05-16 13:32) [5]Грузи в память, а там дальше разбивай, это явно быстрее будет.
← →
oxffff © (2012-05-16 13:38) [6]Можно сделать непрерывный блок, и обернуть его анонимных методом с двумя параметрами индексами.
Отступы по внешнему массиву предварительно рассчитать при необходимости.
Будет вкусно и очень полезно. :))
← →
Ega23 © (2012-05-16 13:41) [7]
> Можно сделать непрерывный блок, и обернуть его анонимных
> методом с двумя параметрами индексами.
+1, так и делал.
← →
oxffff © (2012-05-16 13:43) [8]
> Ega23 © (16.05.12 13:41) [7]
>
Вы меня пугаете, Олег. :)
← →
Дмитрий С © (2012-05-16 13:51) [9]
> oxffff © (16.05.12 13:21) [3]
>
> Как в файле идет разделение по первой границе(по внешнему
> массиву)?
> Что это за признак?
Твоего то ответа я больше всего и ждал.
Файла пока нет, будет такой какой нужно.
Эта вся затея нужна для кеширования, чтобы при каждом запуске не ждать пока вся эта структура создастся.
Вот бы выделить память сразу под все, загрузить туда а потом наделать ссылок на дин. массивы. Предварительно накрутив счетчик ссылок, чтобы delphi не попытался освободить их.
← →
Ega23 © (2012-05-16 14:13) [10]
> Вы меня пугаете, Олег. :)
На самом деле, была куча здоровых файлов с кучей вот таких вот "массивов".
Загружал его целиком, а там уже метки оффсетов расставлял.
← →
Ega23 © (2012-05-16 14:13) [11]Не совсем то, что ты предложил, но нечто похожее.
← →
oxffff © (2012-05-16 14:19) [12]Идея в коде
function Wrap<T>(const items: array of T;const sizes: array of integer): TFunc<integer, integer, T>;
var Captureditems:array of T;
CapturedOffsets:array of integer;
i:integer;
offset:integer;
begin
Setlength(Captureditems,length(items));
//корректно в случае, когда T не содержит управляемых типов
CopyMemory(Captureditems,@items[0],sizeof(items));
setlength(CapturedOffsets,length(sizes));
offset:=0;
for i:=0 to length(sizes)-1 do
begin
CapturedOffsets[i]:=offset;
inc(offset,sizes[i]);
end;
result:=function (Idx1:integer;Idx2:integer):T
begin
result:=Captureditems[CapturedOffsets[idx1]+Idx2];
end;
end;
Wrap<integer>([1,2,3,4,5,6,7,8,9,10],[4,6]);
← →
oxffff © (2012-05-16 14:20) [13]Правда баги компилятора не радуют.
[DCC Error] Unit1.pas(44): E2506 Method of parameterized type declared in interface section must not use local symbol ":4"
← →
Sapersky (2012-05-16 14:41) [14]Вот бы выделить память сразу под все, загрузить туда а потом наделать ссылок на дин. массивы.
Type
TSomeRecord = record a, b : Integer; end;
PArray =^TArray;
TArray = array[0..(MAXINT div SizeOf(TSomeRecord))-1] of TSomeRecord;
Var
A: array of PArray;
Data : array of TSomeRecord;
begin
SetLength(A, 2);
SetLength(Data, 3 + 4);
A[0] := @Data[0]; A[1] := @Data[3];
A[1, 3].a := 4; // самый последний элемент...
Range Check по второму измерению работать не будет, конструкция с MAXINT в описании массива - чтобы обмануть его и исключить ложные срабатывания. Но можно, конечно, для доступа к элементам написать свою функцию с контролем индексов.
← →
KSergey © (2012-05-16 15:41) [15]Дмитрий С
А сколько динамических массивов-то ожидается? 10..20 по тыще элементов, или тыща по 10 элементов?
Я на что намекаю: если массивов сравнительно мало (но. возможно, они большого объема) - то и не выпендриваться, грузить помассивно, ибо не сэкономить.
А вот если много и маленьких - то может что-то выиграется при загрузке одним куском.
← →
oxffff © (2012-05-16 15:41) [16]
> Sapersky (16.05.12 14:41) [14]
Кстати да, как вариант оптимизации [12].
Храним в CapturedOffsets не отступы, а указатели.
← →
Leonid Troyanovsky © (2012-05-16 18:05) [17]
> Дмитрий С © (16.05.12 13:51) [9]
> Эта вся затея нужна для кеширования, чтобы при каждом запуске
> не ждать пока вся эта структура создастся.
Если при запуске, то можно смотреть на compaund file.
Ежели по-большому - SQL server forever.
--
Regards, LVT.
← →
Cobalt © (2012-05-16 18:38) [18]> Дмитрий С © (16.05.12 13:04)
Опиши, пожалуйста, вкратце задачу - где такое может понадобиться?
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.081 c