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