Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача имени массива в качестве параметра [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);


Наверх

Титульная страница Поиск, карта сайта Написать письмо