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

> 

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

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


Гость






Во-первых, в моем примере используется не TListCallback, а TListStaticCallback, ведь у меня вызываемая процедура не является методом класса. Хотя это не важно, есть 2 версии ForEachCall (для метода класса и для статической процедуры) ...

Цитата
в качестве первого параметра используем указатель <...> на процедуру
Это не указатель на процедуру, а адрес процедуры. Потому что так реализовано.
Цитата
а второй оставляем пустым
Хочешь, я приведу тебе пример, когда тебе понадобится использовать и второй указатель (а не оставлять его пустым)? Ясно же написано: дополнительные данные. Вот попробуй, например, сделать, чтобы при первом вызове процедуры Incr координата X каждой записи, что в списке увеличивалась на 4, а Y - на 8, а при втором вызове - X уменьшалось бы на 3, а Y - увеличивалось на 5. С использованием второго параметра - элементарно (не привлекая глобальных переменных, ибо они - зло)...

Цитата
Тоесть мы для вызова ForEachCall используем два лишних указателя
Если ты считаешь заложенную в реализации гибкость "лишней" - тебя ж никто не заставляет использовать это. Напиши свое, естественно, ты сделаешь это гораздо лучше, правда?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


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

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

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


хорошо, но все же почему мы вызываем(@incr, nil), а не (incr, nil)?


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


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

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

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


вопрос по добавлению нового элемент есть метод Add.
Цитата
public function TFPList.Add(Item: Pointer):Integer;
Description
Add adds a new pointer to the list after the last pointer (i.e. at position Count, thus increasing the item count with 1. If the list is at full capacity, the capacity of the list is expanded, using the Grow method.

но как что ему передавать не что он возвращает не указано... так что это за параметры?

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


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


Гость






Цитата
так что это за параметры?
На входе - тот самый указатель (на данные), который ты добавляешь в список. На выходе - индекс элемента списка, в который этот указатель был занесен.

Добавлено через 2 мин.
Цитата
почему мы вызываем(@incr, nil), а не (incr, nil)
Потому, что при вызове (Incr, nil) компилятор может посчитать, что ты хочешь передать результат вычисления функции, а не саму функцию как параметр, следовательно, его надо переубедить... А как? Правильно, добавляем @, и двусмысленности не возникает.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


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

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

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


хорошо, вроде разобрались...
спасибо.




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


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

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

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


есть задача а не получается smile.gif
существует некий пользовательский класс С, он состоит из нескольких полей, одним из которых является List: TFPList; STATIC;. используя конструктор мы добавляем туда ячейки
{private class} procedure C.Metod2(const Node:TNode);
var
p: ^TNode;
begin
new(p);
p^:=Node;
self.List.Add(p);
end;

, где
TNode = record      
U:UserTipe;;
end;

теперь деструктор
{private class} procedure C.Metod2();
var
SomeU:UserTipe;
begin
SomeU:=self.List[0].TNode.U;//сохраняем поле обьекта <---ОШИБКА!!!
MySnake(MyList[0]).Free; //освобождаем объект
MyList.Delete(0); //удаляем ссылку на него
end;
получаю набор ошибок... в модуле использую {$STATIC ON} и {$mode objfpc}.

что делать?
заранее благодарен.


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


Гость






Присоедини программу полностью, чтоб ее можно было скомпилировать, и получить те же ошибки что и у тебя, а не заниматься непонятно чем...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #28


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

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

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


***


Прикрепленные файлы
Прикрепленный файл  u4volvo.pas ( 623 байт ) Кол-во скачиваний: 203
Прикрепленный файл  UT.pas ( 125 байт ) Кол-во скачиваний: 204


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


Гость






Ну, допустим, для того, чтобы сохранить значение нулевого элемента списка, тебе достаточно сделать:
  SomeU := PUser(List[0])^;
, где PUser = ^UserTipe;

А что дальше у тебя происходит, я не знаю, MySnake не определено...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #30


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

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

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


Цитата(volvo @ 20.07.2007 15:26) *
Ну, допустим, для того, чтобы сохранить значение нулевого элемента списка, тебе достаточно сделать:
  SomeU := PUser(List[0])^;
, где PUser = ^UserTipe;
спасибо
Цитата(volvo @ 20.07.2007 15:26) *
А что дальше у тебя происходит, я не знаю, MySnake не определено...
MySnake читается как MyC smile.gif

Добавлено через 14 мин.
может я что-то делаю не так, но получаю
Цитата
u4volvo.pas(31,16) Warning: Local variable "PUser" does not seem to be initialized
u4volvo.pas(31,11) Error: Incompatible types: got "^UserTipe" expected "UserTipe"
u4volvo.pas(31,16) Fatal: Syntax error, ";" expected but "(" found
u4volvo.pas(31,16) Fatal: Compilation aborted


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


Прикрепленные файлы
Прикрепленный файл  u4volvo.pas ( 635 байт ) Кол-во скачиваний: 202


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


Гость






Я же написал:
Цитата
где PUser = ^UserTipe;
, а значит, я имел в виду описание типа PUser, как указателя на UserTipe, но никак не переменной такого типа...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #32


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

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

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


Цитата(volvo @ 20.07.2007 16:25) *
Я же написал , а значит, я имел в виду описание типа PUser, как указателя на UserTipe, но никак не переменной такого типа...
от этого у меня результат не меняется, только в Incompatible types: got "^UserTipe" expected "UserTipe" вместо "^UserTipe" есть "PUser"...


Прикрепленные файлы
Прикрепленный файл  u4volvo.pas ( 609 байт ) Кол-во скачиваний: 186


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


Гость






Да нельзя делать это с переменной! Нужно приводить к типу:
procedure MyC.Metod2();
type
PUser = ^UserTipe; // <-- Хотя это желательно сделать при описании типа UserTipe, в том же модуле
var
SomeU: UserTipe;
begin
SomeU := PUser(List[0])^;
...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #34


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

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

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


спасибо теперь эта часть( smile.gif ) работает...
Цитата(volvo @ 20.07.2007 16:39) *
Хотя это желательно сделать при описании типа UserTipe, в том же модуле
Почему?
и еще
{...}implementation{...}
procedure MyC.Metod2();
var
SomeU:UserTipe;
begin
SomeU := PUser(List[0])^; //тут, благодаря тебе, работает..
self.List[0].Free; //а тут нет sad.gif
//необходимо отчищать память где находилось то на что указывал указатель, но как?
self.List.Delete(0);
end;
end.




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


Гость






Вот что мне непонятно - это твое нежелание использовать ООП везде, а не только где-то... Смотри:

ut.pas
type
PUser = ^UserTipe;
UserTipe = object
x: integer;

destructor done;
end;

implementation

destructor UserTipe.Done;
begin
// Пока можно оставить пустым
end;


Второй файл

...
procedure MyC.Metod2();
var
SomeU: UserTipe;
begin
SomeU := PUser(List[0])^; // Сохраняем данные
Dispose(PUser(List[0]), Done); // Удаляем объект по указателю ...
List.Delete(0); // ... и сам указатель
end;
...

Не нужно Self все время за собой таскать, компилятор и так разберется...

Цитата
Почему?
Именно потому, что типы объекта и указателя на него логически связаны сильнее, чем тип списка и указателя на объект... Да и еще. Мало ли, где тебе придется использовать указатель на объект, что будешь делать - определять несколько раз один и тот же тип указателя?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #36


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

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

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


одни вопросы smile.gif
Цитата(volvo @ 20.07.2007 18:08) *
Вот что мне непонятно - это твое нежелание использовать ООП везде, а не только где-то...
Так получается smile.gif
Цитата(volvo @ 20.07.2007 18:08) *
Пока можно оставить пустым
Пока? А что потм туда надо будет писать?
Цитата(volvo @ 20.07.2007 18:08) *
Dispose(PUser(List[0]), Done);
а что будет работать быстрее данный способ или c FreeMem и определением размера(хотя его можна задать константой)?
Цитата(volvo @ 20.07.2007 18:08) *
Не нужно Self все время за собой таскать, компилятор и так разберется...
мне так удобней...
Цитата(volvo @ 20.07.2007 18:08) *
Именно потому, что типы объекта и указателя на него логически связаны сильнее, чем тип списка и указателя на объект... Да и еще. Мало ли, где тебе придется использовать указатель на объект, что будешь делать - определять несколько раз один и тот же тип указателя?
убедил smile.gif

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


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


Гость






Цитата
мне так удобней...
Мало ли, как тебе удобнее... Ты мало того, что делаешь лишние действия, так еще и рискуешь нарваться на проблемы. Не забывай, что ты работаешь с Class Methods, так что Self может указывать на Object Instance, а может и на VMT...

Кстати, то что я написал не сработает. Вылетит программа с RTE 210... Вот так - работает:
procedure MyC.Metod2();
var
SomeU: UserTipe;
L: PUser;
begin
SomeU := PUser(List[0])^;
writeln(someu.X);

L := List[0];
Dispose(L); // Это удалит все, что надо - проверено с использованием heaptrc

List.Delete(0);
end;

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


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

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

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


Цитата(volvo @ 20.07.2007 19:45) *
Не забывай, что ты работаешь с Class Methods, так что Self может указывать на Object Instance, а может и на VMT...
кто такой VMT?
Цитата(volvo @ 20.07.2007 19:45) *
heaptrc
а я с этими дебаргерами так и не разобрался...


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


code warrior
****

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

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


Цитата(compiler @ 20.07.2007 20:56) *
кто такой VMT?

Virtual methods table - таблица методов класса. Фактически является "объектом класса".


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

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

 





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