« �ڽ�����ѧ��ת�أ� | ������ҳ | lua �����Ķϵ����� »

Lua ��д C ��չ��ʱ�õ���һЩ����

���췽������ͬ���ʵ���һЩ lua �����⣬��Ҫ�ǹ��� C ��չ���ġ��Ҿ�����Щ�����ԵĶ���ֵͦ�ø����ҷ���һ�£���ô��дƪ blog �ɡ�

ͨ����C ��չ���� C ��������һЩ����Ҫ���� lua ״̬���С�Lua �ṩ�ķ����Ƿ������� ע���� �С����ĵ����ԣ���Ϊ Lua ��ע������ȫ�ֹ����ģ�ѡ�� key ��ʱ����Ҫǧ��С���ˡ����� key �Ѿ��� reference ϵͳ�õ��ˣ�һ�����ǻ������ַ����� key ��

�� C ��ѹ���ַ�����Ч�ʲ������ߣ�������Ϊ�ⲿ�ַ�������״̬��ʱ��Ҫ���� hash ������Ψһ�����¡����ڱ���ֱ��ѹ���ַ��������⣬��ǰд��һƪ blog ̸����( btw, ��ǰ�Ǹ�����Ҳ�������õĽ����������������ǿ�����Ϊһ���ο��� :)

�������뵽��������ܱ�֤Ψһ�Ե� key ��һ�� light userdata ����һ�㣬�ڲο��ֲ��Լ� Programming in Lua �ж����ᵽ��

���ǿ�����һ�� static �����ĵ�ַ��Ϊ key ��ע����������������Ҫ��ֵ���������´��룺

static const void *key = 0; lua_pushlightuserdata(L, (void *)&key); lua_pushnumber(L, myNumber); lua_settable(L, LUA_REGISTRYINDEX);

�����Ͱ�һ�� C �е����� myNumber ����ע�������ˡ������Ժ�Ҫ��������Ȼ�����������Ĵ��룺

lua_pushlightuserdata(L, (void *)&key); lua_gettable(L, LUA_REGISTRYINDEX); myNumber = lua_tonumber(L, -1);

�����õ���һ�� static �����ĵ�ַ�� key �����Ծ��Բ����ͱ�����չ����ͻ��������������һ��ȱ�㣬���� key ����������һ��ȫ�ֱ�����ʽ���֣���̫���ۡ����ң����������õ����� key ��ʱ�򣬲�����ô�����õ���Ҫô������ extern ������ key ��Ҫô����Ҫ��һ����������ʽ��¶һ�������õ����� key ��Ч���ϻ����ִ���һЩ�ۿ��ˡ�

���ھ͸���һ�����еķ������������þ������������⣺ �Ǿ��ǣ���һ�� light userdata �� key ������ key �����ٺ�һ��Ψһ�ַ�������������ÿ������Ҫ�õ� key ָ���ĺ�������Щд��

static const void *key = 0; if (key==0) { lua_getfield (L, LUA_REGISTRYINDEX, "MyExtensionLibrary"); key=lua_touserdata(L,-1); lua_pop(L,1); if (key==0) { key=(void*)&key; lua_pushlightuserdata(L,key); lua_setfield(L, LUA_REGISTRYINDEX, "MyExtensionLibrary"); } }

���������ǾͿ��Զ� key ��һ�ζ��Գ�ʼ���ˡ�����ֻ��ʾ������ʼ�����ֿ�������һ�������ͺ귽���ظ����á�


˳������һ�����ױ����Ե�С���ɣ� ����ͨ���� full userdata ��ʵ�ָ��ӵ� C �ṹ������ C++ �еĶ��󣬰��������� Lua �С�����������Ҫ�� Lua �е�һ�����ݹ��������� userdata �ϡ�Ϊ���� Lua �� gc ���̿�����ȷ�Ĺ�����������Ҫ��һЩ�����Ĺ�����

���²ߵĽ��������ǣ��� userdata �б���һ�����ص� Lua ���� reference ��Ȼ���� userdata ����һ��Ԫ����ʵ��һ�� gc ��Ԫ�������� gc �¼�����ʱ��unref ������ Lua �������������������ĵط����ڣ�ʵ�ֹ��ڷ��������Ҹ� gc ���̴�������������ִ�п�����

�в�����ע�����б���һ��ӳ����������������Ϊ weak table ��ÿ�� userdata �������������� userdata Ϊ key ������Ӱ�����б����������� Lua ���ݡ���ô�������������յĹ��̾Ϳ����� Lua ��������ά���ˡ��䲻����֮�����ڣ�ÿ�� C ���������� userdata ���ص� Lua ����ʱ����Ҫ���õ�ע�����е�����ӳ�������������������õĵ���ƪ blog ǰ�벿���ᵽ�Ķ�������

��ʵ������һ���ϲߣ�Lua ���Ƶ�ʱ���Ϳ��ǵ��ˡ��Ǿ��� full userdata ����ӵ��һ�������Ļ����������������� Lua �����������塣����ȴ���� gc ������ֻ��Ҫ�� lua_getfenv �� lua_setfenv ����д�������͹��� :D

Comments

����Ҫע��һ���ɱ�������C/C++������lua Ӧ��Ҫ��ôʵ�ְ�
I just wanted to comment your blog and say that I really enjoyed reading your blog post here. It was very informative and I also digg the way you write! Keep it up and I'll be back to read more soon mate
���õİ취һ�㶼�ǰ�c++�����ĵ�ַ����lightuserdata��õ�ʱ��ֱ��ȡ����ָ����������Ϊ����һ�㶼�������ij�Ա�������ⲿ������ʱ���ڲ�˳��������������û��ע����������lua�
���������Ҫ���� windows api��֧�֡� ����û���ֳɵ� ����dll�ӿڣ� ����һ�����ң��dz��ĸ�л����
��һ������lua�����⣬ ��lua��Ӧ�ó���������һ�𣬳��������е�ʱ������lua�ű��� ������lua�ű����Լ�д����������������Ϣ? ����������Ϣ������
��ǰûע����`lua_getfenv`�� `lua_setfenv`���������������ֿ�������ʵ������pascal��with object do�Ĺ���
лл�ṩ��
lua�������
��,�Ҵ��������׵ı��� 17���������׷������Զ���,18��9��ǰҪ�ҷɵ�����ȥ,�����ڳ�����������ǧ��....
�Ʒ���ס�ں��ݵĹŶ�·�������������ϰ���·�Ͽ���һ�������ӿ����㣬�Ǻǣ������ڻ��dz�����
lua�������

Post a comment

�������������ص������뵽�����Ա�