![]() |
![]() ![]() |
![]() |
volvo |
![]()
Сообщение
#21
|
Гость ![]() |
Во-первых, в моем примере используется не TListCallback, а TListStaticCallback, ведь у меня вызываемая процедура не является методом класса. Хотя это не важно, есть 2 версии ForEachCall (для метода класса и для статической процедуры) ...
Цитата в качестве первого параметра используем указатель <...> на процедуру Это не указатель на процедуру, а адрес процедуры. Потому что так реализовано. Цитата а второй оставляем пустым Хочешь, я приведу тебе пример, когда тебе понадобится использовать и второй указатель (а не оставлять его пустым)? Ясно же написано: дополнительные данные. Вот попробуй, например, сделать, чтобы при первом вызове процедуры Incr координата X каждой записи, что в списке увеличивалась на 4, а Y - на 8, а при втором вызове - X уменьшалось бы на 3, а Y - увеличивалось на 5. С использованием второго параметра - элементарно (не привлекая глобальных переменных, ибо они - зло)...Цитата Тоесть мы для вызова ForEachCall используем два лишних указателя Если ты считаешь заложенную в реализации гибкость "лишней" - тебя ж никто не заставляет использовать это. Напиши свое, естественно, ты сделаешь это гораздо лучше, правда? |
compiler |
![]()
Сообщение
#22
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
хорошо, но все же почему мы вызываем(@incr, nil), а не (incr, nil)?
-------------------- Спасибо!
Удачи! |
compiler |
![]() ![]()
Сообщение
#23
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
вопрос по добавлению нового элемент есть метод 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 - 18.07.2007 18:47 -------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#24
|
Гость ![]() |
Цитата так что это за параметры? На входе - тот самый указатель (на данные), который ты добавляешь в список. На выходе - индекс элемента списка, в который этот указатель был занесен.Добавлено через 2 мин. Цитата почему мы вызываем(@incr, nil), а не (incr, nil) Потому, что при вызове (Incr, nil) компилятор может посчитать, что ты хочешь передать результат вычисления функции, а не саму функцию как параметр, следовательно, его надо переубедить... А как? Правильно, добавляем @, и двусмысленности не возникает. |
compiler |
![]()
Сообщение
#25
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
хорошо, вроде разобрались...
спасибо. -------------------- Спасибо!
Удачи! |
compiler |
![]()
Сообщение
#26
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
есть задача а не получается
![]() существует некий пользовательский класс С, он состоит из нескольких полей, одним из которых является List: TFPList; STATIC;. используя конструктор мы добавляем туда ячейки {private class} procedure C.Metod2(const Node:TNode); , где TNode = record теперь деструктор {private class} procedure C.Metod2();получаю набор ошибок... в модуле использую {$STATIC ON} и {$mode objfpc}. что делать? заранее благодарен. -------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#27
|
Гость ![]() |
Присоедини программу полностью, чтоб ее можно было скомпилировать, и получить те же ошибки что и у тебя, а не заниматься непонятно чем...
|
compiler |
![]()
Сообщение
#28
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
***
Прикрепленные файлы ![]() ![]() -------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#29
|
Гость ![]() |
Ну, допустим, для того, чтобы сохранить значение нулевого элемента списка, тебе достаточно сделать:
SomeU := PUser(List[0])^;, где PUser = ^UserTipe; А что дальше у тебя происходит, я не знаю, MySnake не определено... |
compiler |
![]()
Сообщение
#30
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
Ну, допустим, для того, чтобы сохранить значение нулевого элемента списка, тебе достаточно сделать: спасибоSomeU := PUser(List[0])^;, где PUser = ^UserTipe; А что дальше у тебя происходит, я не знаю, MySnake не определено... MySnake читается как MyC ![]() Добавлено через 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 - 20.07.2007 15:46 Прикрепленные файлы ![]() -------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#31
|
Гость ![]() |
Я же написал:
Цитата где PUser = ^UserTipe; , а значит, я имел в виду описание типа PUser, как указателя на UserTipe, но никак не переменной такого типа... |
compiler |
![]()
Сообщение
#32
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
Я же написал , а значит, я имел в виду описание типа PUser, как указателя на UserTipe, но никак не переменной такого типа... от этого у меня результат не меняется, только в Incompatible types: got "^UserTipe" expected "UserTipe" вместо "^UserTipe" есть "PUser"...Прикрепленные файлы ![]() -------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#33
|
Гость ![]() |
Да нельзя делать это с переменной! Нужно приводить к типу:
procedure MyC.Metod2(); |
compiler |
![]()
Сообщение
#34
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
спасибо теперь эта часть(
![]() Хотя это желательно сделать при описании типа UserTipe, в том же модуле Почему?и еще {...}implementation{...} -------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#35
|
Гость ![]() |
Вот что мне непонятно - это твое нежелание использовать ООП везде, а не только где-то... Смотри:
ut.pas type Второй файл Не нужно Self все время за собой таскать, компилятор и так разберется... Цитата Почему? Именно потому, что типы объекта и указателя на него логически связаны сильнее, чем тип списка и указателя на объект... Да и еще. Мало ли, где тебе придется использовать указатель на объект, что будешь делать - определять несколько раз один и тот же тип указателя? |
compiler |
![]() ![]()
Сообщение
#36
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
одни вопросы
![]() Вот что мне непонятно - это твое нежелание использовать ООП везде, а не только где-то... Так получается ![]() Пока можно оставить пустым Пока? А что потм туда надо будет писать?Dispose(PUser(List[0]), Done); а что будет работать быстрее данный способ или c FreeMem и определением размера(хотя его можна задать константой)?Не нужно Self все время за собой таскать, компилятор и так разберется... мне так удобней...Именно потому, что типы объекта и указателя на него логически связаны сильнее, чем тип списка и указателя на объект... Да и еще. Мало ли, где тебе придется использовать указатель на объект, что будешь делать - определять несколько раз один и тот же тип указателя? убедил ![]() Сообщение отредактировано: compiler - 20.07.2007 18:28 -------------------- Спасибо!
Удачи! |
volvo |
![]()
Сообщение
#37
|
Гость ![]() |
Цитата мне так удобней... Мало ли, как тебе удобнее... Ты мало того, что делаешь лишние действия, так еще и рискуешь нарваться на проблемы. Не забывай, что ты работаешь с Class Methods, так что Self может указывать на Object Instance, а может и на VMT...Кстати, то что я написал не сработает. Вылетит программа с RTE 210... Вот так - работает: procedure MyC.Metod2(); |
compiler |
![]()
Сообщение
#38
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: ![]() ![]() ![]() |
Не забывай, что ты работаешь с Class Methods, так что Self может указывать на Object Instance, а может и на VMT... кто такой VMT? heaptrc а я с этими дебаргерами так и не разобрался...-------------------- Спасибо!
Удачи! |
hardcase |
![]()
Сообщение
#39
|
![]() code warrior ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: ![]() ![]() ![]() |
кто такой VMT? Virtual methods table - таблица методов класса. Фактически является "объектом класса". -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
![]() ![]() |
![]() |
Текстовая версия | 7.07.2025 23:30 |