|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | 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) сносит башню  что делать?  |