![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
|||
|
|||
|
А быстродействие алгоритма по первому и второму способу одинаковое?
|
|
#17
|
||||
|
||||
|
Цитата:
|
|
#18
|
|||
|
|||
|
Спасибо большое!
+2 |
|
#19
|
|||
|
|||
|
У меня немного другая задача. Нужно в процедуре заполнить значения элементов массива, изменив его размер.
Как я понял, в этом случае нужно в основной программе "обновить" указатель на массив, примерно следующем образом: Код:
var DATA : array of Float; p:pointer; procedure MassEdit(var pMass : Pointer); var mass: array of Float; begin Pointer(mass) := pMass; SetLength(mass,3); mas[0]:=1; mas[1]:=1; mas[2]:=1; pMass:=@mass[0]; Pointer(mass) :=nil; end; //далее идёт кусок из текста, в котором обращаюсь к процедуре ... p:=@DATA[0]; MassEdit(p); pointer(DATA):=p; ... //далее обращаемся к элементам массива DATA Я правильно делаю? |
|
#20
|
||||
|
||||
|
Цитата:
Код:
TDataArr = array of Float Код:
procedure MassEdit(var pMass : TDataArr); ... |
|
#21
|
|||
|
|||
|
Цитата:
И не понятно: что передавать в процедуру? Если смотреть в лоб, то получается, что я должен передать безразмерный массив. Хм, если процедуру вызвать так, то всё работает. Код:
MassEdit(DATA); Спасибо! Я так понимаю, в этом случае через стек передаётся только указатель на массив? Последний раз редактировалось ilyas09, 11.11.2010 в 17:00. |
|
#22
|
|||
|
|||
|
кажется у меня похожая проблема, но у меня все это не работает
я пытался решить проблему так: http://www.delphisources.ru/forum/sh...ad.php?t=14362 затем решил сделать иначе: Код:
type
ArrayOfConst = array of TVarRec;
function _const (anArgs: array of const) : ArrayOfConst;
var
I : WORD;
Index : WORD;
Length : WORD;
begin
Length := 0;
if ( High (anArgs) >= 0 ) then
Length := Length + High (anArgs) - Low (anArgs) +1;
if ( Length > 0 ) then
begin
SetLength (Result,Length);
Index := 0;
for I := Low (anArgs) to High (anArgs) do
begin
Result [Index] := anArgs [i];
Inc (Index);
end;
end;
end;
function ParamToArrayOfConst (const aValue: TVarRec) : ArrayOfConst;
begin
Result := _const([]);
with aValue do
try
case VType of
vtPointer: Pointer (Result) := VPointer;
end;
except
Result := _const([]);
end;
end;
function arrays (anArgs: array of const) : String;
var
I : WORD;
A : ArrayOfConst;
begin
Result := '';
for I := Low (anArgs) to High (anArgs) do
begin
A := ParamToArrayOfConst (anArgs [i]);
if Assigned (A) then
begin
if ( I <= Low (anArgs) ) then
Result := arrays (A)
else
Result := Format ('%s, %s',[ Result, arrays (A) ]);
end
else if ( I <= Low (anArgs) ) then
Result := ParamToStr (anArgs [i])
else
Result := Format ('%s, %s',[ Result, ParamToStr (anArgs [i]) ]);
end;
Result := Format ('[%s]',[Result]);
end;
caption := arrays ([ 'a', _const(['test1']), 'b', _const(['test2','test3']), 'c', TForm, Pointer(TForm){, Pointer(form1)}, NIL, self, _const(['test4','test5', 2.718281828459045, _const(['A','B','C']), 'test6' ]), 'hello', pi ]);
Все отлично работает, но только до тех пор, пока я не передам в массив какой-то другой указатель. Как мне правильно отличить типы переменных, на которые указывают указатели? если указатель Pointer(TForm) еще как-то обрабатывается Except-ом, то Pointer(form1) сносит башню ![]() что делать? ![]() |