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