![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Указатели
Del © (2009-08-13 19:30:00)Конец рабочего дня...
Вопросик:
procedure TForm1.Button1Click(Sender: TObject);
var
P: Pointer;
J: Integer;
IntArr: ^TIntegerDynArray;
begin
New(IntArr);
SetLength(IntArr^, 5);
for J := 0 to 5 - 1 do
IntArr^[J] := J;
P := IntArr^;
for J := 0 to Length(TIntegerDynArray(P)) - 1 do
Memo7.Lines.Add(IntToStr(TIntegerDynArray(P)[J]));
SetLength(TIntegerDynArray(P), 0);
----------Здесь P = nil и в итоге указатель сам не уничтожается методом
---------- Dispose(P) в итоге засоряю пармять... как лечить???
Dispose(P);
end;
Del (2009-08-14 11:53:00) [1]Вариантный массив полюбому будет занимать больше места, и есть больше времени... а вот насколько... не тестил.
Подход такой: лучше то что быстрее и меньше.
С VarArrayCreate, не пробывал... ну ща замучу тестик...
Del (2009-08-14 11:49:00) [2]
> Сергей М. © (13.08.09 20:42) [28]
>
>
> > читать [0]
>
>
> В [0] полная ахинея, что ее читать ?
>
Это не рабочий код, а пример на вскидку, дабы указать на суть проблемы, а именно как грохнуть Pointer из памяти.
Loginov Dmitry (2009-08-13 21:48:00) [3]> так и времени проца
Для ускорения обработки вариантных массивов можно запросить
адрес начала массива с помощью функции VarArrayLock().
Loginov Dmitry (2009-08-13 21:45:00) [4]> не подходит, объемы данных очень большие... будет много
> есть как памяти так и времени проца
Существуют вариантные массивы. Элементы в памяти расположены обычным
образом - друг за другом, памяти ест не больше, чем обычные массивы,
преимущество - ими можно обмениваться между приложениями через COM
(DCOM, ActiveX, OLE уж не знаю, как это все правильнее обозвать).
Элементы могут быть одного из стандартных типов (Byte, Word, Integer,
Single, Double, Boolean, WideString, Date, Variant и т.п.). Создаются такие
массивы с помощью функции VarArrayCreate(). Можно сделать вариантный
массив вариантов и т.д. Преимещество в том, что всегда можно определить
тип элементов таких массивов, для этого есть функции в модуле Variants
(для динамических массивов сделать это куда сложнее).
Anatoly Podgoretsky (2009-08-13 20:50:00) [5]> Palladin (13.08.2009 20:09:13) [13]
Я знаю. но вторая часть уже относится к динамической переменной ссылке на динамический массив - вот это может свихнуть любые мозги.
Сергей М. (2009-08-13 20:42:00) [6]
> читать [0]
В [0] полная ахинея, что ее читать ?
Сергей М. (2009-08-13 20:40:00) [7]
> Del (13.08.09 20:36) [25]
> будет много есть как памяти так и времени проца
Это ты из пальца высосал ?
Или проводил собственноручные замеры и имеешь статданные для сравнения ?
Del (2009-08-13 20:38:00) [8]Тема уехала далеко от вопроса...
я не спрашиваю как реализовывать... меня интересует как разрулить с указателями
читать [0]
Del (2009-08-13 20:36:00) [9]Вариант первое что пришло в голову...
не подходит, объемы данных очень большие... будет много есть как памяти так и времени проца
Palladin (2009-08-13 20:34:00) [10]до полного просветления )
Palladin (2009-08-13 20:34:00) [11]читать [20] и [21]
Del (2009-08-13 20:33:00) [12]не "ку" далеко не "ку" потому что это явный массив массивов интов.
а мне нужно работать с массивом который содержит массивы разных типов данных.
Реализовать сие можно через указатели, по другому не придумал.
Вызываться будет примерно так:
Method([@[1,2], @['asd', 'dsfdfs'], @[True, False]])
(я для примера... на самом деле вместо @['asd', 'dsfdfs'] естественно @ArrayOfString, тоесть переменные)
Сергей М. (2009-08-13 20:27:00) [13]
> как по вашему это описать?
По-нашему это описывается array of variant.
Palladin (2009-08-13 20:26:00) [14]
> [17] Del (13.08.09 20:22)
тогда смотри в сторону VarArrayCreate и иже с ними (see also то бишь)... любые типы, любые пертурбации в пределах разумного
Del (2009-08-13 20:26:00) [15]упс...
чет я уже запарился...
выдать должно так:
"1 Значение1 Trye
2 Значение2 False"
Palladin (2009-08-13 20:24:00) [16]
Type
TM=Array of Integer;
TMM=Array of TM;
Var
gmm:TMM;
Procedure AAToStr(Const mm:TMM):String;
Var
i,j:Integer;
Begin
Result:='';
For i:=0 to Length(mm)-1 Do
Begin
For j:=0 to Length(mm[i])-1 Do
Result:=Result+IntToStr(mm[i,j])+',';
SetLength(Result,Length(Result)-1);
Result:=Result+#13#10;
End;
SetLength(Result,Length(Result)-2);
End;
Procedure AddMToMM(Var mm:TMM;Const m:TM);
Begin
SetLength(mm,Length(mm)+1);
mm[Length(mm)-1]:=m;
End;
Function FillM:TM;
Var
n,i:Integer;
Begin
n:=Random(5);
SetLength(Result,n);
For i:=0 to n-1 Do
Result[i]:=Random(100);
End;
Var
i:Integer;
Begin
gmm:=Nil;
For i:=0 to Random(10)-1 Do
AddMToMM(gmm,FillM);
ShowMessage(AAToStr(gmm));
End;
ку?
Del (2009-08-13 20:22:00) [17]это то да...
только не все так просто...
дело в том что в метод могут передать допустим следующее:
{IntegerArray = [1, 2]
StringArray = ['Значение1','Значение2']
BooleanArray = [True, False]}
Method([@IntegerArray, @StringArray, @BooleanArray])
и как по вашему это описать?
а выдать должно:
'1, 2
Значение1, Значение2
True, False'
Palladin (2009-08-13 20:18:00) [18]массив массивов организуется проще пареной репы
mm:Array of Array of Integer;
и не нужно никаких указателей
Del (2009-08-13 20:17:00) [19]очепятка:
Поясню, первый метод(!!!) допустим получил массив из трех массивов(int),
Del (2009-08-13 20:10:00) [20]тайна такова...
есть метод, принимающий массив массивов(неизвестных типов), он копит сие массивы в приватной переменной (тож дин массив).
Далее есть другой метод который из этой переменной выдергивает порциями "сумму" массивов в строковом формате.
Поясню, первый массив допустим получил массив из трех массивов(int),
[[1,2], [3,4],[5,6]]
он заливает его в приватную переменную. Далее второй метод выдаст следующее:
'1,2'
'3,4'
'5,6'
в строковом виде (именно в таком порядке).