www.boolean.name

www.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   К вопросу об указателях (http://forum.boolean.name/showthread.php?t=7823)

impersonalis 12.02.2009 08:38

К вопросу об указателях
 
Хотелось бы пролить свет на следующий вопрос. Я напишу - а вы скажите, что не правильно. Я весьма грубо работал с терминологией, т.к. меня интересовали лишь общие детали реализации (поридираться я и сам могу)

В Blitz-е все экземпляры типов создаются всегда только с максимальной областью видимости - иными словами, глобально для всей программы.
Таким образом каждая конструкция типа
Код:

MyElem.MyType
описывает указатель на элемент типа MyType.
В свою очередь, MyElem может принять либо адрес существующего экземпляра типа:
Код:

Local XElem.MyType=New MyType
MyElem=XElem

или вновь созданного оператором New
Код:

MyElem=New MyType
К указателю может быть применена операция (int), т.е. тайп-каст к целому числу (хотя на самом деле, ничего общего нет - это все-голишь способ имперсонализации\сериализации указателя, а не приведения типа данных) путём применения к нему недокументированной команды Handle:
Код:

x=Handle(MyElem)
Обратная операция осуществялется констуркцией с использованием недокументированной команды Object:
Код:

MyElem=Object.MyType(x)
Все экземпляры типа автоматически добавляются в единый (для данного типа) двунаправленный список элементов.

Значение в MyElem (х3 как его получить - но тем не менее это же число) насколько я понимаю - есть физический адрес в ОЗУ, в то время как Handle (дескриптор) является некоей биекцией ставящей каждому казтелю данного типа в соотвествие некторое, слабопрогнозируемео значение.

HolyDel 12.02.2009 08:50

Ответ: К вопросу об указателях
 
можно уточнить, что сопоставление handle и объекта происходит во время первого вызова handle, а не создания объекта, как можно было бы подумать.

SBJoker 12.02.2009 08:54

Ответ: К вопросу об указателях
 
Это подтверждает мою догадку что handle это хеш-функция.

jimon 12.02.2009 10:10

Ответ: К вопросу об указателях
 
Может там есть какой-то глобальный список и туда помещаются указатели на связаный список типа при вызове handle ?
а сам handle возращает индекс из этого глобального списка (грубо говоря указатель на узел в связаном списке)

я так делал (уже не помню где) чтобы передавать параметры в скриптовый движок

impersonalis 12.02.2009 11:37

Ответ: К вопросу об указателях
 
Причём получается - что работать с экземпляром можно только через указатель.

Dream 12.02.2009 11:55

Ответ: К вопросу об указателях
 
Код:

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()

вот сопстно подтверждение того что было сказано выше.
Хендл обьектом даётся по порядку его вызова, и сохраняются за елементом.
в первом случаем вызывались по порядку, сначало все елементы первого типа, потом все елементы второго типа. Хендлы шли по порядку.

во втором случае хендлы вызывались через один. зендлы идут попорядку
и чтобы убедится в утверждениях, вызываем ещё раз хендлы для второго списка и получаем числа через одно)

HolyDel 12.02.2009 12:35

Ответ: К вопросу об указателях
 
к слову, я тему посчет handle уже поднимал, но развития она не получила:
http://forum.boolean.name/showthread.php?t=3045

Dream 12.02.2009 12:36

Ответ: К вопросу об указателях
 
Хочу сказать что блиц странная вещь... мне кажется его придумали для завладением разумов рус программистов под видом удобного языка....

IGR 12.02.2009 13:50

Ответ: К вопросу об указателях
 
Вот, тоже самое, только в квадратных скобочках :lol:
по идеи, по правилами переведения типов, не должно там быть этих скобочек, так что эту мутню\удобство придумали специально !!
Код:

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()


IGR 12.02.2009 15:01

Ответ: К вопросу об указателях
 
а еще при создании елемента типа резервируется 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()


moka 12.02.2009 15:37

Ответ: К вопросу об указателях
 
Больше кажется что было это сделано чисто для соблюдения типов переменных в синтаксисе, по сути, почему тогда не назначают численное значение эллементу сразу - компилятор тогда будет переводить это как числа, и такая структура:
123414 = New 3434
Будет тупить?
Поэтому тип данных для компилятора, назначаемый эллементу другой - чтобы лучше отличить?
Иль это тупые догадки?

Вообще в B3D очень примитивная работа с недо-классами. Когда берёшь BM и постигаешь Классы в нём, с их ООП, то дорога обратно, можно сказать, вами намеренно закрыта. Анти рекламка Хехе.

impersonalis 12.02.2009 18:30

Ответ: К вопросу об указателях
 
2IGR
вы невнимательны:
www.boolean.name > Программирование игр для компьютеров > Blitz3D > Переводы > Перевод хелпа - Type
Цитата:

Хитрая уловка для целей отладки или для сохранения данных от элементов типов в файл, заключается в использовании команды Str$(). Print Str$() будет выводить значения каждого поля элемента типа, по очереди, отделяя их запятыми и заключая в квадратные скобки, например [15,42, »Fluffy»,500].
2MoKa
Цитата:

Вообще в B3D очень примитивная работа с недо-классами. Когда берёшь BM и постигаешь Классы в нём, с их ООП, то дорога обратно, можно сказать, вами намеренно закрыта. Анти рекламка Хехе.
При всём уважении и отношении как к блестящему дизайнеру и моделлеру, всё же: это лишнее в даннной теме

2DimasSup
получается простраснтво хендлов едино для разных типов объектов?

Вот, IGR, юзает тайпкаст к целому числу:
Код:

Int(s)
результат физический адрес? это достоверно?

Dream 12.02.2009 19:48

Ответ: К вопросу об указателях
 
Цитата:

получается простраснтво хендлов едино для разных типов объектов?
Да, для всех обьектов всех типов, хендлы идут в последовательности вызова 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, даже если создавать имаги между созданиями новых экзепляров, вывод, скорее всего это указатель на указатель,и хранятся в отдельной области памьяти

Dream 30.08.2009 23:16

Ответ: К вопросу об указателях
 
ещё один интересный факт...
Код:

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. может кто уже и сам это сделал просто хочу чтобы это осталось в этом топике, для полного раскрытия темы


Часовой пояс GMT +1, время: 23:20.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot