Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.048 c
1-1117133145
Genie™
2005-05-26 22:45
2005.06.14
Как получить имя автора из doc файла?


1-1117378688
Destroyer
2005-05-29 18:58
2005.06.14
Как использовать Drag&Drop для разных объектов?


1-1117235832
Dark123us
2005-05-28 03:17
2005.06.14
ошибка при попытке выгрузки Dll


1-1117542941
Леха
2005-05-31 16:35
2005.06.14
Присвоение значений Edit через цикл


3-1115474287
eLVik
2005-05-07 17:58
2005.06.14
Отличить ключевое поле от обычного (ADO)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский