Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Вниз

Функция с указателем на массив (чайник)   Найти похожие ветки 

 
Pavelkq   (2005-02-21 10:26) [0]

Здравствуйте! Впервые решил не перебрасывать в функцию весь массив, как делал раньше, а передать ей только указатель на первый элемент и вернуть такой же указатель. В теории понимаю, как это работает, но каков синтаксис, не знаю:-( Помогите пожалуйста!
 Имею динамический массив
var Indexses: array of MyType;
Надо сделать функцию сортировки (это естественно сам сделаю) и вызов типа:
Indexes:=SortInd(Indexes)
но через указатели!


 
Инструктор   (2005-02-21 10:31) [1]

procedure SortInd(Ind : TIndexses);
begin
    .....
end;

type
   TIndexses = array of MyType;
var
  Indexses : TIndexses;

SortInd(Indexses);


Чем не устраивает?


 
Юрий Зотов ©   (2005-02-21 10:36) [2]

> Pavelkq   (21.02.05 10:26)

Переменная типа "динамический масив чего угодно" - это уже указатель и есть. Так что ее и передавайте - вот прямо так, как сами уже и написали.


 
Pavelkq   (2005-02-21 12:16) [3]

Ах, да! Я забыл, что в функцию не будут передаваться (перебрасываться) все данные массива, а именно укажатель и передастся:-)


 
Чапаев ©   (2005-02-21 12:24) [4]

> Indexes:=SortInd(Indexes)
А вот так делать крайне нежелательно... Лучше уж procedure SortInd(const InArr:TArray; var OutArray:TArray).


 
Pavelkq   (2005-02-21 12:30) [5]

Вот это уже интереснее. Только мне нужна функция, которая вернет тоже массив.


 
Чапаев ©   (2005-02-21 12:38) [6]

> Только мне нужна функция, которая вернет тоже массив.
Зачем именно функция? В принципе, можно и функцией, но вот если, к примеру, ты потом эту функцию запихаешь в dll и будешь импортировать в основную программу, будут проблемы...


 
Pavelkq   (2005-02-21 12:57) [7]

А если это процедура, как вы указали, то данные будут отсортированы в памяти и указатель массива останется на первом элементе? Имею в виду все корректро будет?
 Кстати, Джулиан Бакнелл рекомендует использовать экземпляр TList. Не бует проблем?


 
Чапаев ©   (2005-02-21 13:00) [8]

> Имею в виду все корректро будет?
От тебя зависит. ;-)

> Кстати, Джулиан Бакнелл рекомендует использовать экземпляр TList. Не бует проблем?
Ну... Проблем-то не будет. Но TList оперирует с указателями. Нередко это -- стрельба из пушки по воробьям. Обычно практичнее оперировать с наследниками TStrings.


 
Чапаев ©   (2005-02-21 13:01) [9]

> Имею в виду все корректро будет?
От тебя зависит. ;-)

> Кстати, Джулиан Бакнелл рекомендует использовать экземпляр TList. Не бует проблем?
Ну... Проблем-то не будет. Но TList оперирует с указателями. Нередко это -- стрельба из пушки по воробьям. Обычно практичнее оперировать с наследниками TStrings.


 
Чапаев ©   (2005-02-21 13:02) [10]

> Имею в виду все корректро будет?
От тебя зависит. ;-)

> Кстати, Джулиан Бакнелл рекомендует использовать экземпляр TList. Не бует проблем?
Ну... Проблем-то не будет. Но TList оперирует с указателями. Нередко это -- стрельба из пушки по воробьям. Обычно практичнее оперировать с наследниками TStrings.


 
Инструктор   (2005-02-21 13:02) [11]

> [8] Чапаев ©   (21.02.05 13:00)

А... можно подробнее про Tstrings и TList? В чем воробьи?


 
begin...end ©   (2005-02-21 13:09) [12]

> Pavelkq   (21.02.05 12:57) [7]

> то данные будут отсортированы в памяти
Будут. Если Вы их отсортируете.

> указатель массива останется на первом элементе?
Непонятный вопрос.

> Кстати, Джулиан Бакнелл рекомендует использовать
> экземпляр TList.
Рекомендует для чего?


 
Чапаев ©   (2005-02-21 13:23) [13]

> var Indexses: array of MyType;
Если MyType -- объектный тип, то TList/TStrings подходит очень хорошо. А вот если type MyType=Byte, то придётся что-то придумывать, чтобы байт представить в виде указателя (скорее всего, будет что-то вроде type MyType=class MyField:Byte end;).


 
begin...end ©   (2005-02-21 13:27) [14]

> Чапаев ©   (21.02.05 13:23) [13]

> Если MyType -- объектный тип, то TList/TStrings
> подходит очень хорошо.
Так а почему TStrings лучше, чем TList?

> А вот если type MyType=Byte, то придётся что-то
> придумывать, чтобы байт представить в виде указателя
> (скорее всего, будет что-то вроде type MyType=class
> MyField:Byte end;).
А как же динамическое выделение памяти?


 
Чапаев ©   (2005-02-21 13:31) [15]

> Так а почему TStrings лучше, чем TList?
В TString хранятся TObject, в TList -- Pointer. Конечно, однозначно говорить "удобнее" нельзя, но обычно удобнее таки с TObject работать.

> А как же динамическое выделение памяти?
Га?


 
begin...end ©   (2005-02-21 13:34) [16]

> Чапаев ©   (21.02.05 13:31) [15]

> В TString хранятся TObject, в TList -- Pointer.
> обычно удобнее таки с TObject работать.
Автор ветки ничего не говорил о том, что такое TMyType.

> Га?
Ась?


 
Чапаев ©   (2005-02-21 13:43) [17]

> Автор ветки ничего не говорил о том, что такое TMyType.
Потому и растекаюсь мыслию по древу.

> Ась?
Так к чему там было о "динамическом выделении памяти"?


 
begin...end ©   (2005-02-21 13:48) [18]

> Чапаев ©   (21.02.05 13:43) [17]

> Так к чему там было о "динамическом выделении памяти"?
Ну я имел в виду, что почему бы под элементы не выделять память динамически, получая указатель на каждый элемент, а затем заносить указатели в экземпляр TList?

Хотя я бы для данной задачи оставил бы всё в массиве и не плодил "сущностей без необходимости".


 
Чапаев ©   (2005-02-21 13:59) [19]

> Хотя я бы для данной задачи оставил бы всё в массиве и не плодил "сущностей без необходимости".
Согласен. ;-)


 
Юрий Зотов ©   (2005-02-21 14:00) [20]

> Чапаев

Ох, неправы Вы, Василий Иванович.

> если type MyType=Byte, то придётся что-то придумывать, чтобы
> байт представить в виде указателя

Не придется. Один байт и так отлично укладывается в 4-байтовую область. Надо просто привести тип.

> В TStrings хранятся TObject, в TList -- Pointer.

Это одно и то же. Надо просто привести тип.


 
begin...end ©   (2005-02-21 14:08) [21]

> Юрий Зотов ©   (21.02.05 14:00) [20]

>> В TStrings хранятся TObject, в TList -- Pointer.
>  Это одно и то же. Надо просто привести тип.

Его даже не надо приводить явно. Вероятно, он приводится автоматически.


 
Юрий Зотов ©   (2005-02-23 13:15) [22]

> begin...end ©   (21.02.05 14:08) [21]

В одну сторону - да. В другую - надо.


 
Anatoly Podgoretsky ©   (2005-02-23 13:26) [23]

Pavelkq   (21.02.05 12:30) [5]
function SortInd(const Indexses: TIndexses): TIndexses;



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.035 c
1-1108944752
Bes
2005-02-21 03:12
2005.03.06
Зависание TThreadList


14-1108408065
Torry
2005-02-14 22:07
2005.03.06
"Петров-Водкинъ"


14-1108223163
fg
2005-02-12 18:46
2005.03.06
Спрашиваю ))


10-1085582560
Damager
2004-05-26 18:42
2005.03.06
Excel не закрывается


14-1108285177
iZEN
2005-02-13 11:59
2005.03.06
Зачем нужны имена у файлов?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский