Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.14;
Скачать: CL | DM;

Вниз

Передача имени массива в качестве параметра   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
1-1117108498
Borik
2005-05-26 15:54
2005.06.14
Как программно скопировать из Ворд в Делфи


1-1117122983
Hromosom
2005-05-26 19:56
2005.06.14
Как двигать окно программы нажав на ней мышью?


1-1117437824
Rentgen
2005-05-30 11:23
2005.06.14
Как раскрыть весь TreeView?


1-1117283847
illuha
2005-05-28 16:37
2005.06.14
Память


4-1114230724
Andrewk88
2005-04-23 08:32
2005.06.14
System directory