forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   BlitzMax (http://forum.boolean.name/forumdisplay.php?f=104)
-   -   Ptr и Var : как работает ? (http://forum.boolean.name/showthread.php?t=5904)

dimanche13 30.04.2008 18:45

Ответ: Ptr и Var : как работает ?
 
Код:

Global list:TList = New TList
Type TType
        Field varr:int
        Function create_v:TType( _param:int )
                Local cre:TType = New TType
                cre.varr = _param
                      list.AddLast(cre)
                Return cre
        End Function
End Type
Local obj:TType=TType.create_v( 5 )


Bagration 30.04.2008 19:06

Ответ: Ptr и Var : как работает ?
 
О_0 /. Гы, вы меня не поняли. Мне не нужно присваивать переменной какое то значение какойто переменной, а указатель, что бы при изменении переменной-указателя менялось значение указываемой переменной. Как в случае с моим кодом...

moka 30.04.2008 19:10

Ответ: Ptr и Var : как работает ?
 
Там ты прибовляешь к mode колличество созданных объектов..
Ы? Я туплю или ты меня завернул в салфетку..

dimanche13 30.04.2008 21:13

Ответ: Ptr и Var : как работает ?
 
Хочу помочь. но я ничего не понял, если честно.

Bagration 01.05.2008 18:09

Ответ: Ptr и Var : как работает ?
 
:) Вот представим, имеется меню, кнопки, при нажатии определенной кнопки меняется значение глобальной переменной а переменной типа меню. Делается это указателями, то есть я не передаю значение а лишь даю понять проге какую переменную надо увеличить или уменьшить , короче не важно действия, главное суть. Вот ниже я привел пример:
Код:

Global ButtonList:TList = New TList
'varriables
Global varriable_1:Int
Global varriable_2:Int
Global varriable_3:Int
Type TButtonGUI
        Field pos_x:Int, pos_y:Int
        Field color:Int[4]
        Field txt:String
        Function Button:TButtonGUI(txt:String, pos_x:Int, pos_y:Int)
                Local Button:TButtonGUI = New TButtonGUI
                        button.txt = txt
                        button.pos_x = pos_x
                        button.pos_y = pos_Y
                        button.color[1] = 0
                        button.color[2] = 0
                        button.color[3] = 128
                        ButtonList.AddLast(Button)
        End Function
        Method update(name:String, ukazatel Var)
                If MouseX() >= pos_x And MouseY() >= pos_y And MouseX() <= pos_x + 250 And MouseY() <= pos_y + 70 Then
                        color[1] = 255
                        color[2] = 0
                        color[3] = 0
                        If txt = name Then
                                If MouseHit(1) Then
                                        ukazatel:+1
                                End If
                        End If
                        Else
                        color[1] = 0
                        color[2] = 0
                        color[3] = 128
                End If
               
        End Method
        Method draw()
                SetColor(color[1] , color[2] , color[3] )
                DrawRect(pos_x, pos_y, 250, 70)
                SetColor(0, 0, 0)
                DrawText(txt, pos_x + 125 - TextWidth(txt) *.5, pos_y + 35 - TextHeight(txt) *.5)
        End Method
End Type
Function UpdateButton(txt:String, ukazatel Var)
        For Local up_button:TButtonGUI = EachIn ButtonList
                up_button.update(txt, ukazatel)
                up_button.draw
        Next
End Function
 
Graphics (800, 600, 0, 60, 2)

HideMouse
TButtonGUI.Button("Varriable 1", 50, 100)
TButtonGUI.Button("Varriable 2", 50, 300)
TButtonGUI.Button("Varriable 3", 50, 500)

While Not KeyHit(KEY_ESCAPE)
        Cls
        UpdateButton("Varriable 1", varriable_1)
        UpdateButton("Varriable 2", varriable_2)
        UpdateButton("Varriable 3", varriable_3)
        'cursor
        SetColor(255, 255, 255)
        DrawOval(MouseX(), MouseY(), 4, 4)
        'txt
        SetColor(255, 255, 255)
        DrawText("MouseX: " + MouseX(), 20, 20)
        DrawText("MouseY: " + MouseY(), 20, 40)
        DrawText("Varriable 1 = " + varriable_1, 600, 20)
        DrawText("Varriable 2 = " + varriable_2, 600, 40)
        DrawText("Varriable 3 = " + varriable_3, 600, 60)
        Flip
Wend

Здесь я создал 3 кнопки, потом в упдейте дал указания какой кнопке какую переменную увеличить.
UpdateButton("Varriable 1", varriable_1)
UpdateButton("Varriable 2", varriable_2)
UpdateButton("Varriable 3", varriable_3)
Жирными буквами указаны указатели.
А нельзя ли скажем добавить в типе меню еще переменную указатель, Varriable , которая будет хранить указатель на нужную переменную, но тип филда не могу задать :( . Потом создание кнопок будет уже следующим:
TButtonGUI.Button("Varriable 1", 50, 100,varriable_1)
TButtonGUI.Button("Varriable 1", 50, 100,varriable_2)
TButtonGUI.Button("Varriable 1", 50, 100,varriable_3)
Потом исходя из того что в типе меню есть переменная указатель, то в упдейте просто увеличивается Varriable(указатель) на 1 или еще что. (смотреть метод обновления). Тогда теоретически не придеться каждый раз вызывать Упдейт с разными значениями.
Как думаете такое возможно?:)
Надеюсь я понятно изьяснился. :-)

Bagration 02.05.2008 21:37

Ответ: Ptr и Var : как работает ?
 
Я не понятно выразился или такое не возможно сделать? :dontknow:

FDsagizi 02.05.2008 21:46

Ответ: Ptr и Var : как работает ?
 
Объясняеш ты ППЦ как нормально.

ЗЫ ему надо хранить указатель на какуюто переменую.

zheland 04.05.2008 23:45

Ответ: Ptr и Var : как работает ?
 
Код:


Local variable1 : Short Ptr
Local variable2 : Byte Ptr
variable2 = Byte Ptr ( variable )

перевод переменной из одного типа в другой не работает!
как быстро перевести?

jimon 05.05.2008 00:21

Ответ: Ptr и Var : как работает ?
 
drunnik
тебе это зачем вообще ?

moka 05.05.2008 00:57

Ответ: Ptr и Var : как работает ?
 
ПсМ
Багратион, а тебя не устроит массив? нада будет хранить только индекс.

Bagration 05.05.2008 01:15

Ответ: Ptr и Var : как работает ?
 
Цитата:

Сообщение от MoKa (Сообщение 80580)
ПсМ
Багратион, а тебя не устроит массив? нада будет хранить только индекс.

Нет, зачем это. С указателями имхо было бы круто. Но как реализовать.:wallbash:

moka 05.05.2008 04:11

Ответ: Ptr и Var : как работает ?
 
Индекс на переменную - int вот тебе и указатель.

dimanche13 05.05.2008 11:41

Ответ: Ptr и Var : как работает ?
 
Цитата:

Сообщение от drunnik (Сообщение 80573)
Код:


Local variable1 : Short Ptr
Local variable2 : Byte Ptr
variable2 = Byte Ptr ( variable )

перевод переменной из одного типа в другой не работает!
как быстро перевести?

в смысле не работает? если ты byte-ом указываешь на short, то он будет разбит на 2 байта var[0] & var[1]
Код:

Local variable1 : Short Ptr
Local variable2 : Byte Ptr

Local sh:Short = $ABCD

variable1 = Short Ptr ( Varptr(sh) )

Print Hex(variable1[0])  ' ABCD

variable2 = Byte Ptr( Varptr(sh) )

Print Hex(variable2[0])  ' CD
Print Hex(variable2[1])  ' AB


zheland 08.05.2008 00:12

Ответ: Ptr и Var : как работает ?
 
Немножко по теме.

Например у меня есть список .
Так-же есть 2 объекта :
Как первый объект поместить в список полностью ,
А на второй поместить только ссылку .

Тоже самое с переменными :
Как копировать тип в другую переменную ,
И как сделать на него только ссылку в другой переменной .

Просто постоянно путаюсь . СоВсЕм уже запутался .:@

jimon 08.05.2008 11:20

Ответ: Ptr и Var : как работает ?
 
я что-то тоже из темы выпадаю :(
local somevar:TType = new TType
somevar это же указатель на кусок памяти

local someint% = 1
someint это уже обьект

к примеру :
Код:

type TType
field test% = 1
end type

local sint% = 1
local stype:TType = new TType

debuglog "sint"
debuglog sint
i1(sint)
debuglog sint
i2(sint)
debuglog sint

debuglog "stype"
debuglog stype.test
t1(stype)
debuglog stype.test
t2(stype)
debuglog stype.test

function i1(i%)
i = 2
end function

function i2(i% var)
i = 3
end function

function t1(t:ttype)
t.test = 2
end function

function t2(t:ttype var)
t = new ttype 'вот тут мы подмениваем именно указатель !
t.test = 3
end function

в итоге в дебаге должны получить
Цитата:

sint
1
1
3
stype
1
2
3
потому что int копируется в новое значение
а stype это и так указатель

так же мои мысли потверждаются кодом : (файл blitz_object.h)

Код:


#ifndef BLITZ_OBJECT_H
#define BLITZ_OBJECT_H

#include "blitz_types.h"

#ifdef __cplusplus
extern "C"{
#endif

#define BBNULL (&bbNullObject)

struct BBClass{
        //extends BBGCPool
        BBClass*        super;
        void                (*free)( BBObject *o );
       
        BBDebugScope*debug_scope;

        int                instance_size;

        void                (*ctor)( BBObject *o );
        void                (*dtor)( BBObject *o );
       
        BBString*        (*ToString)( BBObject *x );
        int                (*Compare)( BBObject *x,BBObject *y );
        BBObject*        (*SendMessage)( BBObject *m,BBObject *s );
        void                (*_reserved1_)();
        void                (*_reserved2_)();
        void                (*_reserved3_)();
       
        void*        vfns[32];
};

struct BBObject{
        //extends BBGCMem
        BBClass*        clas;
        int                refs;
};

extern        BBClass        bbObjectClass;
extern        BBObject bbNullObject;

BBObject*        bbObjectNew( BBClass *t );
void                bbObjectFree( BBObject *o );

void                bbObjectCtor( BBObject *o );
void                bbObjectDtor( BBObject *o );

BBString*        bbObjectToString( BBObject *o );
int                bbObjectCompare( BBObject *x,BBObject *y );
BBObject*        bbObjectSendMessage( BBObject *m,BBObject *s );
void                bbObjectReserved();

BBObject*        bbObjectDowncast( BBObject *o,BBClass *t );

void                bbObjectRetain( BBObject *o );
void                bbObjectRelease( BBObject *o );

void                bbObjectRegisterType( BBClass *clas );
BBClass**        bbObjectRegisteredTypes( int *count );

#ifdef __cplusplus
}
#endif

#endif

все функции работают не с обьектами, а с указателями на них
что собственно и логично :)

можно конечно получать указатель на переменную,
но я написал на blitzmaxе больше 700 кб кода и мне редко когда такое нужно было

drunnik
в итоге в список не получится поместить обьект Object
полностью, как я понимаю
добавляя Object в список ты и так добавляешь туда его ссылку

если тебе нужны простые указатели типа Int
пользуйся командами : HandleFromObject и прочими


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

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