Показать сообщение отдельно
Старый 08.05.2008, 11:20   #30
jimon
 
Сообщений: n/a
Ответ: 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 и прочими

Последний раз редактировалось jimon, 08.05.2008 в 11:27.
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
zheland (08.05.2008)