|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
|||
|
|||
А быстродействие алгоритма по первому и второму способу одинаковое?
|
#17
|
||||
|
||||
Цитата:
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#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); ... TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#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) сносит башню что делать? |