TList, FP |
TList, FP |
compiler |
14.07.2007 20:22
Сообщение
#1
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Добрый день
Существует ли список в FP, как встроенный тип? говорят что да но найти о нем в руководстве не могу ни слова -------------------- Спасибо!
Удачи! |
volvo |
14.07.2007 20:28
Сообщение
#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 |
14.07.2007 20:32
Сообщение
#3
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
спасибо...
а что такое notification mechanism? Добавлено через 5 мин. а всетаки в документации найти не могу... у меняв Reference guide for Free Pascal, version 2.0.4 Document version 2.0тут Chapter 2 это про Сonstants... -------------------- Спасибо!
Удачи! |
volvo |
14.07.2007 20:52
Сообщение
#4
|
Гость |
Документация утверждает ,что у TList-а есть механизм, позволяющий сообщать об изменениях, произошедших в списке, что может замедлить общее быстродействие. Правда, где бы не встречалось упоминание этого самого "notification mechanism", везде говорится в таком стиле: "не знаю, что это такое, никогда не пользовался этим, однако оно есть".
Я вот тоже не пользовался (а может, и пользовался, только не знаю, что это так называется) - просто предупреждаю, о том, о чем написано в доках. Добавлено через 1 мин. P.S. Сорри, это не ref.pdf, а RTL.pdf, естественно... |
compiler |
15.07.2007 18:08
Сообщение
#5
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
мда... ихний список совсем не список... мне совсем непонятно как им пользоваться, смотрел дукументацию ( где нет ни одного примера ), исходники, был на оф. сайте, все равно не понял... может у кого есть простенький пример показывающий его использывывание?
-------------------- Спасибо!
Удачи! |
volvo |
15.07.2007 18:37
Сообщение
#6
|
Гость |
А может лучше ты расскажешь, что хочешь получить? А то знаешь ли, примеры могут быть разные, вдруг тебе СОВСЕМ не это надо? Чего хранить-то хочешь, вообще? Сохранил, что потом делать с данными?
|
compiler |
15.07.2007 18:48
Сообщение
#7
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
А может лучше ты расскажешь, что хочешь получить? А то знаешь ли, примеры могут быть разные, вдруг тебе СОВСЕМ не это надо? Чего хранить-то хочешь, вообще? Сохранил, что потом делать с данными? в каждой ячейке списка у меня должно быть указатель на следующий элемент либо nil, если это последний элемент, пользовательский тип и, возможно, переменная -- указывывающая порядковый номер ячейки. Список должен , методами добавления/удаления новых ячеек с обоих сторон списка(обладать конструктором/деструктором для отдельных ячеек), методами доступа к полям любой из ячеек , может еще что-то. Все должно иметь возможность выполняться имея лишь указатель на ячейку. -------------------- Спасибо!
Удачи! |
volvo |
15.07.2007 19:58
Сообщение
#8
|
Гость |
Цитата в каждой ячейке списка у меня должно быть указатель на следующий элемент либо nil, если это последний элемент Все, про TList можешь забыть - реализуй список сам...Пойми: вместо того, чтобы как в каменном веке реализовывать список с нуля, тебе предлагают уже готовый контейнер для хранения указателей (в TVision это называется "коллекция"), позволяющий тебе искать элементы, сортировать, производить над каждым из них (или над теми, которые удовлетворяют какому-либо условию, это уже как реализуешь) какие-то действия... А ты вместо этого хочешь хранить "указатель на следующий элемент", и делать все вручную? Тогда делай вручную... |
compiler |
15.07.2007 20:09
Сообщение
#9
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Все, про TList можешь забыть - реализуй список сам... Пойми: вместо того, чтобы как в каменном веке реализовывать список с нуля, тебе предлагают уже готовый контейнер для хранения указателей (в TVision это называется "коллекция"), позволяющий тебе искать элементы, сортировать, производить над каждым из них (или над теми, которые удовлетворяют какому-либо условию, это уже как реализуешь) какие-то действия... А ты вместо этого хочешь хранить "указатель на следующий элемент", и делать все вручную? Тогда делай вручную... просто как работать с классическим списком я читал, а как с таким даже не представляю... указатель мне нужен просто что б как-то обращаться именно к этому элементу... -------------------- Спасибо!
Удачи! |
hardcase |
17.07.2007 1:06
Сообщение
#10
|
code warrior Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
просто как работать с классическим списком я читал, а как с таким даже не представляю... указатель мне нужен просто что б как-то обращаться именно к этому элементу... TList скорее ближе по духу к массиву. Классический список прдоставляет последовательный доступ к элементам, тогда как TList позволяет ображаться к содержимому по индексу, грубо говоря, TList внутри себя содержит массив элементов, над которым происходят действия типа Insert, Delete и т.д. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
compiler |
17.07.2007 13:12
Сообщение
#11
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
А простым примером по использовыванию никто не поделиться?
-------------------- Спасибо!
Удачи! |
volvo |
17.07.2007 14:08
Сообщение
#12
|
Гость |
Так, например:
uses classes; |
compiler |
17.07.2007 14:25
Сообщение
#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 - 17.07.2007 14:26 -------------------- Спасибо!
Удачи! |
volvo |
17.07.2007 14:56
Сообщение
#14
|
Гость |
У меня по умолчанию выставлен {$mode delphi}
|
compiler |
17.07.2007 15:05
Сообщение
#15
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
У меня по умолчанию выставлен {$mode delphi} [оффтоп]а у меня диалект...[/оффтоп] спасибо, так все компилируется, теперь будем разбираться...Сообщение отредактировано: compiler - 17.07.2007 15:06 -------------------- Спасибо!
Удачи! |
volvo |
17.07.2007 15:25
Сообщение
#16
|
Гость |
Для диалекта - надо добавить кое-что в заголовки процедур:
{$mode objfpc} |
compiler |
17.07.2007 15:39
Сообщение
#17
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Для диалекта - надо добавить кое-что в заголовки процедур я все равно не могу понять способ вызова процедур...на примере incr my_list.foreachcall(@incr, nil);//для каждого элемента my_list вызываем эту процедурузачем передавать nil? procedure incr(p: pointer; arg: pointer); -------------------- Спасибо!
Удачи! |
volvo |
17.07.2007 15:50
Сообщение
#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 - 17.07.2007 15:52 |
compiler |
17.07.2007 16:45
Сообщение
#19
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
С чего бы это? туманно все как-то...посмотрев исходники кажеться понял зачем nil -- просто так..
итак мы вызываем метод(в качестве первого параметра используем указатель(почему?) на процедуруа второй оставляем пустым), процедура возвразщает 2 указателя, которые преобразуются в некий TListCallback. Тоесть мы для вызова ForEachCall используем два лишних указателя .Так? Сообщение отредактировано: compiler - 17.07.2007 17:02 -------------------- Спасибо!
Удачи! |
hardcase |
17.07.2007 17:07
Сообщение
#20
|
code warrior Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
TListCallback - это процедура которую будет вызывать ForEachCall для КАЖДОГО элемента списка и передавать ей этот элемент первым параметром.
Втрой указаталь - arg нужен для того, чтобы передавать в TListCallback некие дополнительные параметры, например, если мы хотим отфильтровать список, в качестве arg будет выстпуать новый список, в котором будут аккумулироваться разультаты фильтрации. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Текстовая версия | 26.09.2024 6:20 |