![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача имени массива в качестве параметра [D6, Win2k]
Pavelkq © (2005-05-24 13:21:00)Я дико извиняюсь, тему закрыли и, очевидно, дальше все должно быть предельно просто. Но вопрос такой: Имею несколько глобальных массивов T1, T2... Так же написал процедуры (сортировка, поиск и т.п.) Задача - вызывать процедуры, передавая в качестве параметра имя массива. Попробовал так:
Procedure SortArr (MyArray: array of MyType);
begin
// Сортировка массива MyArray
end;
Procedure MainProg;
begin
SortArr (T1);
SortArr (T2);
end;
Может прокатит, если сделать функцию типа array of MyType? Но это не очень удобно.
Как бы сделать так, чтобы можно было передать имя массива, а процедура выполняла бы действия над этим массивом (а не над MyArray)?
Mx (2005-05-24 17:15:00) [1]
> evvcom ©
Через AllocMem неудобно, разве в этом случае появится то поле, что begin...end получил по смещению? Будет ли корректна в этом случае дальнейшая работа с массивом? Я имею ввиду Finalize, Length и тому подобные. По-моему, нет.
Проблему решил приведением Result'а к типу массива и вся работа осуществляется с ним, правда это страшно коряво выглядит, но другого варианта не вижу.
evvcom (2005-05-24 16:12:00) [2]
> begin...end © (24.05.05 16:04) [12]
Смотри, через некоторое время у него возникнут вопросы, а как потом эту память освобождать. Использовать хакерские приемы можно, если четко представляешь себе, что ты делаешь.
begin...end (2005-05-24 16:04:00) [3]> Mx © (24.05.05 14:58) [10]
function Get(...): Pointer;
var
V: array of sometype;
begin
SetLength(V, xxx);
...
Inc(PLongint(Longword(V) - 8)^);
Result := V;
end
:o)))
evvcom (2005-05-24 15:52:00) [4]
> на выходе из функции массив будет уничтожен
правильно понимаешь
> Как сделать чтоб именно через Pointer вернулся созданный
> динамический массив?
Память выделяй через AllocMem или ей подобные, а работай через указатели.
Mx (2005-05-24 14:58:00) [5]О! Думаю здесь пойдет разместить такой вопросик:
А как вернуть массив через Pointer? Например функция такая:
function Get(...): Pointer;
var
V: array of sometype;
begin
SetLength(V, xxx);
...
Result := V;
end;
Насколько я понимаю на выходе из функции массив будет уничтожен и результат будет бесполезен. Как сделать чтоб именно через Pointer вернулся созданный динамический массив?
begin...end (2005-05-24 14:00:00) [6]> Digitman © (24.05.05 13:55) [8]
Отличаются, потому что свойство TList.Items читается через метод, в котором производится проверка на выход затребованного индекса за границы.
Но, в принципе, у TList есть свойство List -- через него можно получить непосредственный доступ к массиву элементов экземпляра TList.
Digitman (2005-05-24 13:55:00) [7]
> Скоростью доступа к N-ному элементу.
т.е ты утверждаешь, что скорости доступа к
MyVarArray[i]
и
MyList[i]
где
MyVarArray: variant; //или array of чего-то там
MyList: наследник TList;
радикально отличаются ?
Pavelkq (2005-05-24 13:49:00) [8][5] - Спасибо огромное! Получилось! Главное, я понял в чем дело!
Pavelkq (2005-05-24 13:40:00) [9]Скоростью доступа к N-ному элементу.
begin...end (2005-05-24 13:39:00) [10]> Pavelkq (24.05.05 13:33) [3]
Насколько я понял, передаваемые массивы -- динамические.
type
TMyTypeArr = array of TMyType;
procedure SortArr(var MyArray: TMyTypeArr);
begin
...
end;
var
T1, T2: TMyTypeArr;
begin
...
SortArr(T1)
...
end.
Digitman (2005-05-24 13:37:00) [11]дались тебе эти динамические и открытые массивы !
чем списки-то не устраивают ?)
Pavelkq (2005-05-24 13:33:00) [12][1] - при первой же
SetLength(MyArray,Length(MyArray)*2);возникает ошибка еще при компиляции Incompatible types
А нельзя это как-то указателями сделать? Я с ними толком не работал еще.
Digitman (2005-05-24 13:25:00) [13]
> Pavelkq (24.05.05 13:21)
> это не очень удобно
что значит "не очень удобно" ?
не нравятся открытые массивы ? Не используй ! делов-то ..
easy (2005-05-24 13:23:00) [14]
Procedure SortArr (var MyArray: array of MyType);