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)

zheland 12.04.2008 23:42

Ptr и Var : как работает ?
 
Ptr и Var : для чего нужны и как работают ?:@

jimon 12.04.2008 23:45

Ответ: Ptr и Var : как работает ?
 
указатели на переменные
к примеру чтобы можно внутри функции изменить аргумент который в неё подается

dimanche13 13.04.2008 00:21

Ответ: Ptr и Var : как работает ?
 
ptr - *, var - &(byref param), varptr-&(get address)

zheland 13.04.2008 01:13

Ответ: Ptr и Var : как работает ?
 
А как ими пользоваться ?

Horror 13.04.2008 14:58

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

function Set(var В:Integer)
{
B=5
}
//гдетто при вызове
A:integer
Set(A)

результат
A=5

есля я правельно все написал
то это пример что ты можешь в функцию засунуть свою переменныю
и в функции ее изменить
очень удобно

ПС бмакс совсем не знаю)
написал примерно))

moka 14.04.2008 18:19

Ответ: Ptr и Var : как работает ?
 
Horror, почти прально написал (синтаксис не тот только), но суть именно та.
var - передаёт не значение переменной, а сам указатель на переменную, это почти также как заглобалить переменную и юзать не передовая, только - это не корректный подход будет :) При этом порой и не подходящий вовсе.

HolyDel 14.04.2008 18:22

Ответ: Ptr и Var : как работает ?
 
Horror очень здорово написал. это истинный псевдокод - семесь Си, паскаля и бейсика.
+1 как говорится.

dimanche13 14.04.2008 22:49

Ответ: Ptr и Var : как работает ?
 
Да, за такой псевдокод и +100 не жалко ;)

Horror 15.04.2008 00:35

Ответ: Ptr и Var : как работает ?
 
пасибо!
Ну главное чтоб понятно было))
надеюс автор понял))
я то в бмаксе не шарю))

zheland 30.04.2008 12:28

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

А как ими пользоваться ?
А как пользоваться Ptr
*Можно-ли перевести Byte Ptr в Short Ptr

moka 30.04.2008 12:56

Ответ: Ptr и Var : как работает ?
 
drunnik, Ptr - это массив.
К примеру: Byte Ptr - это массив байтов.
К примеру в Xors'е есть функция: xEntityName(Entity%), она возвращает массив байтов, я делаю так:

Код:

Function BPtoString$(tByte:Byte Ptr)
  Local tName$
  For Local i%=0 to 256
      If tByte[i]=Null Return tName
      tName:+Chr(tByte[i])
  Next
End Function

Код:

Local EntityName$=BPtoString(xEntityName(Entity))

zheland 30.04.2008 13:02

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

*Можно-ли перевести Byte Ptr в Short Ptr
Просто
Код:

Byte Ptr ( variable : Short Ptr )
не работает

moka 30.04.2008 16:07

Ответ: Ptr и Var : как работает ?
 
drunnik, не понял что ты такое прописал :)
Объясни что дано и что хочешь получить.

Bagration 30.04.2008 16:52

Ответ: Ptr и Var : как работает ?
 
Здраствуйте, пишу потому уже два часа не могу одну проблему решить, гы стыд мне! :mad: :''((
Как мне в филдах создать переменную указатель? Скажем для GUI, при создании кнопки указываем ей переменную которой она манипулирует. Потом в упдейте идет увеличиения или уменьшение переменной.
Я смог только в методе обновления сделать входное данное с указателем, код ниже.
Код:

Global mode:Int = 2
Global list:TList = New TList
Type TType
        'Field varr:int
        Function create_v:TType()
                Local cre:TType = New TType
                        'cre.varr = varra
                        list.AddLast(cre)
        End Function
        Method update(varr Var)
                varr:+1
        End Method
End Type
TType.create_v()
For Local up:TType = EachIn list
        up.update(mode)
Next

Print mode

Но сей способ мне не нравиться, что мне теперь каждый раз писать Упдейт(нужная переменная)? :4to:
Намного имхо грамотнее если я при создании кнопки укажу какую переменную будет увеличивать или уменьшать кнопка.:)

moka 30.04.2008 18:04

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


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

Local obj:TType=TType.create_v()

obj.varr:+1


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 и прочими

zheland 08.05.2008 16:49

Ответ: Ptr и Var : как работает ?
 
не очень понял :
Просто ответьте какие функции нужны для того что-бы :
Найти адрес переменной ;
По адресу возвратить переменную .

jimon 08.05.2008 21:23

Ответ: Ptr и Var : как работает ?
 
var получает адресс переменой
ptr получает то что хранится в переменной


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

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