IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> TList, FP
сообщение
Сообщение #1


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Добрый день
Существует ли список в FP, как встроенный тип?
говорят что да но найти о нем в руководстве не могу ни слова sad.gif


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


спасибо...
а что такое notification mechanism?


Добавлено через 5 мин.
а всетаки в документации найти не могу... у меняв Reference guide for Free Pascal, version 2.0.4 Document version 2.0тут Chapter 2 это про Сonstants...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Документация утверждает ,что у TList-а есть механизм, позволяющий сообщать об изменениях, произошедших в списке, что может замедлить общее быстродействие. Правда, где бы не встречалось упоминание этого самого "notification mechanism", везде говорится в таком стиле: "не знаю, что это такое, никогда не пользовался этим, однако оно есть".

Я вот тоже не пользовался (а может, и пользовался, только не знаю, что это так называется) - просто предупреждаю, о том, о чем написано в доках.

Добавлено через 1 мин.
P.S.
Сорри, это не ref.pdf, а RTL.pdf, естественно...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


мда... ихний список совсем не список... мне совсем непонятно как им пользоваться, смотрел дукументацию ( где нет ни одного примера ), исходники, был на оф. сайте, все равно не понял... может у кого есть простенький пример показывающий его использывывание?


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






А может лучше ты расскажешь, что хочешь получить? А то знаешь ли, примеры могут быть разные, вдруг тебе СОВСЕМ не это надо? Чего хранить-то хочешь, вообще? Сохранил, что потом делать с данными?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 15.07.2007 18:37) *
А может лучше ты расскажешь, что хочешь получить? А то знаешь ли, примеры могут быть разные, вдруг тебе СОВСЕМ не это надо? Чего хранить-то хочешь, вообще? Сохранил, что потом делать с данными?

в каждой ячейке списка у меня должно быть указатель на следующий элемент либо nil, если это последний элемент, пользовательский тип и, возможно, переменная -- указывывающая порядковый номер ячейки. Список должен , методами добавления/удаления новых ячеек с обоих сторон списка(обладать конструктором/деструктором для отдельных ячеек), методами доступа к полям любой из ячеек , может еще что-то. Все должно иметь возможность выполняться имея лишь указатель на ячейку.


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата
в каждой ячейке списка у меня должно быть указатель на следующий элемент либо nil, если это последний элемент
Все, про TList можешь забыть - реализуй список сам...

Пойми: вместо того, чтобы как в каменном веке реализовывать список с нуля, тебе предлагают уже готовый контейнер для хранения указателей (в TVision это называется "коллекция"), позволяющий тебе искать элементы, сортировать, производить над каждым из них (или над теми, которые удовлетворяют какому-либо условию, это уже как реализуешь) какие-то действия... А ты вместо этого хочешь хранить "указатель на следующий элемент", и делать все вручную? Тогда делай вручную...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 15.07.2007 19:58) *

Все, про TList можешь забыть - реализуй список сам...

Пойми: вместо того, чтобы как в каменном веке реализовывать список с нуля, тебе предлагают уже готовый контейнер для хранения указателей (в TVision это называется "коллекция"), позволяющий тебе искать элементы, сортировать, производить над каждым из них (или над теми, которые удовлетворяют какому-либо условию, это уже как реализуешь) какие-то действия... А ты вместо этого хочешь хранить "указатель на следующий элемент", и делать все вручную? Тогда делай вручную...

просто как работать с классическим списком я читал, а как с таким даже не представляю... указатель мне нужен просто что б как-то обращаться именно к этому элементу...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


Цитата(compiler @ 15.07.2007 21:09) *

просто как работать с классическим списком я читал, а как с таким даже не представляю... указатель мне нужен просто что б как-то обращаться именно к этому элементу...

TList скорее ближе по духу к массиву.
Классический список прдоставляет последовательный доступ к элементам, тогда как TList позволяет ображаться к содержимому по индексу, грубо говоря, TList внутри себя содержит массив элементов, над которым происходят действия типа Insert, Delete и т.д.


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


А простым примером по использовыванию никто не поделиться?


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Так, например:

uses classes;

type
PT = ^T;
T = record
X, Y: integer;
end;

function compare(a, b: pointer): integer;
begin
if PT(a)^.X > PT(b)^.X then compare := 1
else
if PT(a)^.X < PT(b)^.X then compare := -1
else compare := PT(a)^.Y - PT(b)^.Y;
end;
procedure print(p: pointer);
begin
with PT(p)^ do begin
writeLn('X = ', X:2, ' Y = ', Y:2);
end;
end;
procedure incr(p: pointer);
begin
with PT(p)^ do begin
inc(X); inc(Y);
end;
end;

var
p: PT;
my_list: TFPList;
i: integer;

begin
my_list := TFPList.Create();
for i := 1 to 10 do begin
new(p);
with(p^) do begin
X := random(15); y := random(15);
writeLn('X = ', X:2, ' Y = ', Y:2);
end;
my_list.add(p);
end;

writeln('for each');
my_list.foreachcall(@incr, nil);
my_list.foreachcall(@print, nil);
writeln('sorting');
my_list.sort(@compare);
my_list.foreachcall(@print, nil);

// здесь удалить все элементы и сам список

end.

 К началу страницы 
+ Ответить 
сообщение
Сообщение #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}, то на одну ошибку меньше smile.gif

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






У меня по умолчанию выставлен {$mode delphi}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 17.07.2007 14:56) *
У меня по умолчанию выставлен {$mode delphi}
[оффтоп]а у меня диалект...[/оффтоп] спасибо, так все компилируется, теперь будем разбираться...

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






Для диалекта - надо добавить кое-что в заголовки процедур:
{$mode objfpc}
uses classes;

type
PT = ^T;
T = record
X, Y: integer;
end;

function compare(a, b: pointer): integer;
begin
if PT(a)^.X > PT(b)^.X then compare := 1
else
if PT(a)^.X < PT(b)^.X then compare := -1
else compare := PT(a)^.Y - PT(b)^.Y;
end;
procedure print(p: pointer; arg: pointer); // Еще один параметр
begin
with PT(p)^ do begin
writeLn('X = ', X:2, ' Y = ', Y:2);
end;
end;
procedure incr(p: pointer; arg: pointer); // И здесь тоже ...
begin
with PT(p)^ do begin
inc(X); inc(Y);
end;
end;

var
p: PT;
my_list: TFPList;
i: integer;

begin
my_list := TFPList.Create();
for i := 1 to 10 do begin
new(p);
with(p^) do begin
X := random(15); y := random(15);
writeLn('X = ', X:2, ' Y = ', Y:2);
end;
my_list.add(p);
end;

writeln('for each');
my_list.foreachcall(@incr, nil);
my_list.foreachcall(@print, nil);
writeln('sorting');
my_list.sort(@compare);
my_list.foreachcall(@print, nil);

end.

 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 17.07.2007 15:25) *
Для диалекта - надо добавить кое-что в заголовки процедур
я все равно не могу понять способ вызова процедур...
на примере incr
my_list.foreachcall(@incr, nil);//для каждого элемента my_list вызываем эту процедуру
зачем передавать nil?
procedure incr(p: pointer; arg: pointer); 
//получаем 2 аргумента первый указатель на процедуру,
// второй -- не ясно что...
begin
with PT(p)^ do begin // PT(p)^ ? р-- это ж ведь указатель на процедуру, а не на ячейку или список...
inc(X); inc(Y);
end;
end;




--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 17.07.2007 15:50) *
С чего бы это?
туманно все как-то...

посмотрев исходники кажеться понял зачем nil -- просто так..

my_list.foreachcall(@incr, nil);
//вызов процедуры

procedure incr(p: pointer; arg: pointer); // И здесь тоже ...
//реализация процедуры
begin
with PT(p)^ do begin
inc(X); inc(Y);
end;
end;


procedure TFPList.ForEachCall(proc2call:TListCallback;arg:pointer);
//реализация метода(исходники)
var
i : integer;
p : pointer;
begin
For I:=0 To Count-1 Do
begin
p:=FList^[i];
if assigned(p) then
proc2call(p,arg);
end;
end;

type TListCallback = procedure(
//реализация типа (документация)
data: pointer; //Data pointer from the list.
arg: pointer // Parameter passed to the ForEachCall call. /не нужный параметр?
) of object;

итак мы вызываем метод(в качестве первого параметра используем указатель(почему?) на процедуруа второй оставляем пустым), процедура возвразщает 2 указателя, которые преобразуются в некий TListCallback. Тоесть мы для вызова ForEachCall используем два лишних указателя .Так?

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


TListCallback - это процедура которую будет вызывать ForEachCall для КАЖДОГО элемента списка и передавать ей этот элемент первым параметром.
Втрой указаталь - arg нужен для того, чтобы передавать в TListCallback некие дополнительные параметры, например, если мы хотим отфильтровать список, в качестве arg будет выстпуать новый список, в котором будут аккумулироваться разультаты фильтрации.


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.09.2020 16:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name