|
FAQ Туториалы и часто задаваемые вопросы |
12.02.2009, 11:38
|
#1
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
К вопросу об указателях
Хотелось бы пролить свет на следующий вопрос. Я напишу - а вы скажите, что не правильно. Я весьма грубо работал с терминологией, т.к. меня интересовали лишь общие детали реализации (поридираться я и сам могу)
В Blitz-е все экземпляры типов создаются всегда только с максимальной областью видимости - иными словами, глобально для всей программы.
Таким образом каждая конструкция типа
описывает указатель на элемент типа MyType.
В свою очередь, MyElem может принять либо адрес существующего экземпляра типа:
Local XElem.MyType=New MyType
MyElem=XElem
или вновь созданного оператором New
К указателю может быть применена операция (int), т.е. тайп-каст к целому числу (хотя на самом деле, ничего общего нет - это все-голишь способ имперсонализации\сериализации указателя, а не приведения типа данных) путём применения к нему недокументированной команды Handle:
Обратная операция осуществялется констуркцией с использованием недокументированной команды Object:
Все экземпляры типа автоматически добавляются в единый (для данного типа) двунаправленный список элементов.
Значение в MyElem (х3 как его получить - но тем не менее это же число) насколько я понимаю - есть физический адрес в ОЗУ, в то время как Handle (дескриптор) является некоей биекцией ставящей каждому казтелю данного типа в соотвествие некторое, слабопрогнозируемео значение.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
12.02.2009, 11:50
|
#2
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: К вопросу об указателях
можно уточнить, что сопоставление handle и объекта происходит во время первого вызова handle, а не создания объекта, как можно было бы подумать.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
12.02.2009, 11:54
|
#3
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: К вопросу об указателях
Это подтверждает мою догадку что handle это хеш-функция.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.02.2009, 13:10
|
#4
|
|
Ответ: К вопросу об указателях
Может там есть какой-то глобальный список и туда помещаются указатели на связаный список типа при вызове handle ?
а сам handle возращает индекс из этого глобального списка (грубо говоря указатель на узел в связаном списке)
я так делал (уже не помню где) чтобы передавать параметры в скриптовый движок
|
|
|
12.02.2009, 14:37
|
#5
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: К вопросу об указателях
Причём получается - что работать с экземпляром можно только через указатель.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
12.02.2009, 14:55
|
#6
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: К вопросу об указателях
Type one
Field x
End Type
Type two
Field y
End Type
For i =1 To 5
one.one=New one
one\x=i
Next
For i=5 To 10
two.two=New two
two\y=i
Next
For one.one=Each one
i=i+1
Print Handle (one)
Next
For two.two=Each two
i=i+1
Print Handle (two)
Next
WaitKey()
Type one
Field x
End Type
Type two
Field y
End Type
For i =1 To 5
one.one=New one
one\x=i
Next
For i=5 To 10
two.two=New two
two\y=i
Next
two.two=First two
For one.one=Each one
Print Handle (one)
Print Handle (two)
two=After (two)
Next
Print
For two.two=Each two
Print Handle(two)
Next
WaitKey()
вот сопстно подтверждение того что было сказано выше.
Хендл обьектом даётся по порядку его вызова, и сохраняются за елементом.
в первом случаем вызывались по порядку, сначало все елементы первого типа, потом все елементы второго типа. Хендлы шли по порядку.
во втором случае хендлы вызывались через один. зендлы идут попорядку
и чтобы убедится в утверждениях, вызываем ещё раз хендлы для второго списка и получаем числа через одно)
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Dream за это полезное сообщение:
|
|
12.02.2009, 15:35
|
#7
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: К вопросу об указателях
к слову, я тему посчет handle уже поднимал, но развития она не получила:
http://forum.boolean.name/showthread.php?t=3045
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.02.2009, 15:36
|
#8
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: К вопросу об указателях
Хочу сказать что блиц странная вещь... мне кажется его придумали для завладением разумов рус программистов под видом удобного языка....
|
(Offline)
|
|
12.02.2009, 16:50
|
#9
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Ответ: К вопросу об указателях
Вот, тоже самое, только в квадратных скобочках
по идеи, по правилами переведения типов, не должно там быть этих скобочек, так что эту мутню\удобство придумали специально !!
Type one
Field x
End Type
Type two
Field y
End Type
For i =1 To 5
one.one=New one
one\x=i
Next
For i=5 To 10
two.two=New two
two\y=i
Next
For one.one=Each one
Print Str (one)
Next
For one.one=Each one
Print Handle (one)
Next
WaitKey()
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.02.2009, 18:01
|
#10
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Ответ: К вопросу об указателях
а еще при создании елемента типа резервируется 20 байт ??
; целый тип
Type TInteger
Field x1%;24
End Type
; тип с запятой
Type TFloat
Field x1#;24
End Type
; стороковий тип
Type TString
Field x1$;24
End Type
; пустой тип
Type TVoid
End Type
For counter = 1 To 5
i.TInteger=New TInteger
Next
For counter = 1 To 5
f.TFloat = New TFloat
Next
For counter = 1 To 5
s.TString = New TString
Next
For counter = 1 To 5
v.TVoid = New TVoid
Next
val = 0
Print "TInteger: "
For i.TInteger=Each TInteger
Print Int(i)
Next
Print "TFloat: "
For f.TFloat=Each TFloat
Print Int(f)
Next
Print "TString: "
For s.TString=Each TString
Print Int(s)
Next
Print "TVoid: "
For v.TVoid=Each TVoid
Print Int(v)
Next
WaitKey()
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо IGR за это полезное сообщение:
|
|
12.02.2009, 18:37
|
#11
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: К вопросу об указателях
Больше кажется что было это сделано чисто для соблюдения типов переменных в синтаксисе, по сути, почему тогда не назначают численное значение эллементу сразу - компилятор тогда будет переводить это как числа, и такая структура:
123414 = New 3434
Будет тупить?
Поэтому тип данных для компилятора, назначаемый эллементу другой - чтобы лучше отличить?
Иль это тупые догадки?
Вообще в B3D очень примитивная работа с недо-классами. Когда берёшь BM и постигаешь Классы в нём, с их ООП, то дорога обратно, можно сказать, вами намеренно закрыта. Анти рекламка Хехе.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
12.02.2009, 21:30
|
#12
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: К вопросу об указателях
2 IGR
вы невнимательны:
www.boolean.name > Программирование игр для компьютеров > Blitz3D > Переводы > Перевод хелпа - Type
Хитрая уловка для целей отладки или для сохранения данных от элементов типов в файл, заключается в использовании команды Str$(). Print Str$() будет выводить значения каждого поля элемента типа, по очереди, отделяя их запятыми и заключая в квадратные скобки, например [15,42, »Fluffy»,500].
|
2 MoKa
Вообще в B3D очень примитивная работа с недо-классами. Когда берёшь BM и постигаешь Классы в нём, с их ООП, то дорога обратно, можно сказать, вами намеренно закрыта. Анти рекламка Хехе.
|
При всём уважении и отношении как к блестящему дизайнеру и моделлеру, всё же: это лишнее в даннной теме
2 DimasSup
получается простраснтво хендлов едино для разных типов объектов?
Вот, IGR, юзает тайпкаст к целому числу:
результат физический адрес? это достоверно?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
12.02.2009, 22:48
|
#13
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: К вопросу об указателях
получается простраснтво хендлов едино для разных типов объектов?
|
Да, для всех обьектов всех типов, хендлы идут в последовательности вызова Handle для них.
Вот, IGR, юзает тайпкаст к целому числу:
Int(s)
результат физический адрес? это достоверно?
|
Type TInteger
Field x1%;24
End Type
For counter = 1 To 5
CreateImage(150,10)
i.TInteger=New TInteger
Next
Print "TInteger: "
For i.TInteger=Each TInteger
Print Int(i)
Next
как видим, разница в числах всёравно 24, даже если создавать имаги между созданиями новых экзепляров, вывод, скорее всего это указатель на указатель,и хранятся в отдельной области памьяти
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Dream за это полезное сообщение:
|
|
31.08.2009, 03:16
|
#14
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: К вопросу об указателях
ещё один интересный факт...
Type TInteger
Field x1$;24
Field x2%
End Type
Type TInteger2
Field x1%;24
Field x2%
Field x3#
End Type
Type TInteger3
Field x1%;24
Field x2%
Field x3$
Field x4#
End Type
For counter = 1 To 5
CreateImage(150,10)
i3.TInteger3=New TInteger3;порядок обьявления поменяйте
i2.TInteger2=New TInteger2;пару раз для того чтобы
i.TInteger=New TInteger;понять чтоя хочу показать
i3\x3="dasdasdasd"
Next
Print ""
Print "Type1 "
Print " "
For i.TInteger=Each TInteger
Print Int (i)
Next
Print ""
Print "Type2 "
Print ""
For i2.TInteger2=Each TInteger2
Print Int (i2)
Next
Print ""
Print "Type3 "
Print ""
For i3.TInteger3=Each TInteger3
Print Int (i3)
Next
ПС. видим вот что - (как уже замечалось выше)20- поидее указатель(или что там) на сам обьект структы + 4 на каждое поле в типе в независимости от типа
ПС2. может кто уже и сам это сделал просто хочу чтобы это осталось в этом топике, для полного раскрытия темы
Последний раз редактировалось Dream, 31.08.2009 в 03:27.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:24.
|