Добрый день
Существует ли список в FP, как встроенный тип?
говорят что да но найти о нем в руководстве не могу ни слова
TList, FP |
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
TList, FP |
compiler |
Сообщение
#1
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Добрый день
Существует ли список в FP, как встроенный тип? говорят что да но найти о нем в руководстве не могу ни слова -------------------- Спасибо!
Удачи! |
volvo |
Сообщение
#2
|
Гость |
Не совсем "встроенный". Описан в модуле Classes... А информация о нем - в файле ref.pdf: "Chapter 2.46 TList"
Также может быть полезно посмотреть про TFPList (в разделе 2.42 того же файла), поскольку Цитата Contrary to TList, TFPList has no notification mechanism. If no notification mechanism is used, it is better to use TFPList instead of TList, as the performance of TFPList is much higher. |
compiler |
Сообщение
#3
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
спасибо...
а что такое notification mechanism? Добавлено через 5 мин. а всетаки в документации найти не могу... у меняв Reference guide for Free Pascal, version 2.0.4 Document version 2.0тут Chapter 2 это про Сonstants... -------------------- Спасибо!
Удачи! |
volvo |
Сообщение
#4
|
Гость |
Документация утверждает ,что у TList-а есть механизм, позволяющий сообщать об изменениях, произошедших в списке, что может замедлить общее быстродействие. Правда, где бы не встречалось упоминание этого самого "notification mechanism", везде говорится в таком стиле: "не знаю, что это такое, никогда не пользовался этим, однако оно есть".
Я вот тоже не пользовался (а может, и пользовался, только не знаю, что это так называется) - просто предупреждаю, о том, о чем написано в доках. Добавлено через 1 мин. P.S. Сорри, это не ref.pdf, а RTL.pdf, естественно... |
compiler |
Сообщение
#5
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
мда... ихний список совсем не список... мне совсем непонятно как им пользоваться, смотрел дукументацию ( где нет ни одного примера ), исходники, был на оф. сайте, все равно не понял... может у кого есть простенький пример показывающий его использывывание?
-------------------- Спасибо!
Удачи! |
volvo |
Сообщение
#6
|
Гость |
А может лучше ты расскажешь, что хочешь получить? А то знаешь ли, примеры могут быть разные, вдруг тебе СОВСЕМ не это надо? Чего хранить-то хочешь, вообще? Сохранил, что потом делать с данными?
|
compiler |
Сообщение
#7
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
А может лучше ты расскажешь, что хочешь получить? А то знаешь ли, примеры могут быть разные, вдруг тебе СОВСЕМ не это надо? Чего хранить-то хочешь, вообще? Сохранил, что потом делать с данными? в каждой ячейке списка у меня должно быть указатель на следующий элемент либо nil, если это последний элемент, пользовательский тип и, возможно, переменная -- указывывающая порядковый номер ячейки. Список должен , методами добавления/удаления новых ячеек с обоих сторон списка(обладать конструктором/деструктором для отдельных ячеек), методами доступа к полям любой из ячеек , может еще что-то. Все должно иметь возможность выполняться имея лишь указатель на ячейку. -------------------- Спасибо!
Удачи! |
volvo |
Сообщение
#8
|
Гость |
Цитата в каждой ячейке списка у меня должно быть указатель на следующий элемент либо nil, если это последний элемент Все, про TList можешь забыть - реализуй список сам...Пойми: вместо того, чтобы как в каменном веке реализовывать список с нуля, тебе предлагают уже готовый контейнер для хранения указателей (в TVision это называется "коллекция"), позволяющий тебе искать элементы, сортировать, производить над каждым из них (или над теми, которые удовлетворяют какому-либо условию, это уже как реализуешь) какие-то действия... А ты вместо этого хочешь хранить "указатель на следующий элемент", и делать все вручную? Тогда делай вручную... |
compiler |
Сообщение
#9
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Все, про TList можешь забыть - реализуй список сам... Пойми: вместо того, чтобы как в каменном веке реализовывать список с нуля, тебе предлагают уже готовый контейнер для хранения указателей (в TVision это называется "коллекция"), позволяющий тебе искать элементы, сортировать, производить над каждым из них (или над теми, которые удовлетворяют какому-либо условию, это уже как реализуешь) какие-то действия... А ты вместо этого хочешь хранить "указатель на следующий элемент", и делать все вручную? Тогда делай вручную... просто как работать с классическим списком я читал, а как с таким даже не представляю... указатель мне нужен просто что б как-то обращаться именно к этому элементу... -------------------- Спасибо!
Удачи! |
hardcase |
Сообщение
#10
|
code warrior Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
просто как работать с классическим списком я читал, а как с таким даже не представляю... указатель мне нужен просто что б как-то обращаться именно к этому элементу... TList скорее ближе по духу к массиву. Классический список прдоставляет последовательный доступ к элементам, тогда как TList позволяет ображаться к содержимому по индексу, грубо говоря, TList внутри себя содержит массив элементов, над которым происходят действия типа Insert, Delete и т.д. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
compiler |
Сообщение
#11
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
А простым примером по использовыванию никто не поделиться?
-------------------- Спасибо!
Удачи! |
volvo |
Сообщение
#12
|
Гость |
Так, например:
uses classes; |
compiler |
Сообщение
#13
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
volvo, а в каком режиме ты компилировал?
мой лог Код ex.pas(47,28) Error: Incompatible type for arg no. 1: Got "<address of procedure(Pointer);Register>", expected "<procedure variable type of procedure(Pointer, Pointer);Register>" ex.pas(48,29) Error: Incompatible type for arg no. 1: Got "<address of procedure(Pointer);Register>", expected "<procedure variable type of procedure(Pointer, Pointer);Register>" ex.pas(51,29) Error: Incompatible type for arg no. 1: Got "<address of procedure(Pointer);Register>", expected "<procedure variable type of procedure(Pointer, Pointer);Register>" ex.pas(55,4) Fatal: There were 3 errors compiling module, stopping ex.pas(55,4) Fatal: Compilation aborted если использовать {$mode objfpc}, то на одну ошибку меньше Сообщение отредактировано: compiler - -------------------- Спасибо!
Удачи! |
volvo |
Сообщение
#14
|
Гость |
У меня по умолчанию выставлен {$mode delphi}
|
compiler |
Сообщение
#15
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
У меня по умолчанию выставлен {$mode delphi} [оффтоп]а у меня диалект...[/оффтоп] спасибо, так все компилируется, теперь будем разбираться...Сообщение отредактировано: compiler - -------------------- Спасибо!
Удачи! |
volvo |
Сообщение
#16
|
Гость |
Для диалекта - надо добавить кое-что в заголовки процедур:
{$mode objfpc} |
compiler |
Сообщение
#17
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Для диалекта - надо добавить кое-что в заголовки процедур я все равно не могу понять способ вызова процедур...на примере incr my_list.foreachcall(@incr, nil);//для каждого элемента my_list вызываем эту процедурузачем передавать nil? procedure incr(p: pointer; arg: pointer); -------------------- Спасибо!
Удачи! |
volvo |
Сообщение
#18
|
Гость |
С пониманием природы первого указателя у тебя проблема...
Цитата получаем 2 аргумента первый указатель на процедуру, второй -- не ясно что... С чего бы это? Смотри, что написано:Цитата(rtl.pdf) 2.42.21 TFPList.ForEachCall Synopsis: Call a procedure or method for each pointer in the list. Declaration: procedure ForEachCall(proc2call: TListCallback;arg: pointer) procedure ForEachCall(proc2call: TListStaticCallback;arg: pointer) Visibility: public Description: ForEachCall iterates over all pointers in the list and calls proc2call, passing it the pointer and the additional arg data pointer. Proc2Call can be a method or a static procedure. То есть, первый аргумент - это сам указатель, хранящийся в списке (над элементом, на который он указывает, надо произвести какие-то действия), а второй - дополнительный указатель. Второй ЗДЕСЬ не используется. Сообщение отредактировано: volvo - |
compiler |
Сообщение
#19
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
С чего бы это? туманно все как-то...посмотрев исходники кажеться понял зачем nil -- просто так..
итак мы вызываем метод(в качестве первого параметра используем указатель(почему?) на процедуруа второй оставляем пустым), процедура возвразщает 2 указателя, которые преобразуются в некий TListCallback. Тоесть мы для вызова ForEachCall используем два лишних указателя .Так? Сообщение отредактировано: compiler - -------------------- Спасибо!
Удачи! |
hardcase |
Сообщение
#20
|
code warrior Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
TListCallback - это процедура которую будет вызывать ForEachCall для КАЖДОГО элемента списка и передавать ей этот элемент первым параметром.
Втрой указаталь - arg нужен для того, чтобы передавать в TListCallback некие дополнительные параметры, например, если мы хотим отфильтровать список, в качестве arg будет выстпуать новый список, в котором будут аккумулироваться разультаты фильтрации. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Текстовая версия | 3.05.2024 6:34 |