锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍥炲埌涓婚錛岃褰曚竴涓嬮暅闈㈠弽灝勭煩闃電殑鎺ㄥ銆?/p> 鍦ㄧ敤Irrlicht鍜孯TT鍋氶暅闈㈡晥鏋滅殑鏃跺欙紝鐢ㄥ埌浜?jiǎn)鍙崬畡鐭╅橖c(diǎn)?灝辨槸闇瑕佹妸鎽勭浉鏈洪暅鍍忥紝娓叉煋涓涓猂T錛岃創(chuàng)鍒伴暅闈㈡ā鍨嬩笂銆傝繖涓叾瀹炶繕綰犵粨浜?jiǎn)璁镐箙锛屽洜湄?fù)涔嬪墠鍋氭按闈㈡覆鏌撶殑鏃跺欙紝姘撮潰鏄鉤鐨勶紝寰堝ソ璁$畻鎽勭浉鏈哄湪姘撮潰浠ヤ笅鐨勪綅緗?浣嗘槸鎹㈡垚闀滈潰錛屽氨涓嶄竴鏍蜂簡(jiǎn)錛屽洜涓洪暅闈㈠彲鑳芥槸浠繪剰闈€?浜庢槸灝遍渶瑕佷竴涓氱敤鐨勫弽灝勭煩闃點(diǎn)?/p> 鍙嶅皠鐭╅樀鐨勮綆楁槸鍩轟簬騫抽潰鐨勶紝鍥犱負(fù)錛屼換浣曞弽灝勶紝閮介渶瑕佷竴涓弽灝勯潰銆?/p> 鎵浠ワ紝鎴戜滑鍏堢粰鍑哄鉤闈㈣〃紺?Plane(nx,ny,nz,d); 鍏朵腑(nx,ny,nz)宸茬粡鍗曚綅鍖栥?/p> 鐒跺悗錛屾垜浠亣璁劇┖闂翠腑鏈変換鎰忎竴鐐筆(x,y,z,1) 璁捐繖涓偣P浠lane涓哄弽灝勯潰鐨勯暅鍍忕偣涓篜1(x1,y1,z1,w)銆?/p> 錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛?/p> 鏍規(guī)嵁瀹氱悊錛屾垜浠煡閬擄紝 鑻ヤ袱涓偣浠ユ煇涓鐐逛負(fù)闀滃儚錛屽垯涓や釜鐐圭殑鍧愭爣涔嬪拰闄や互2錛屽氨鍒氬ソ鏄腑鐐廣? 榪欎釜鐞嗚鎴戜滑鐢ㄥ埌榪欓噷鐨勮瘽錛?閭h繖涓腑鐐瑰氨鍒氬ソ鏄鉤闈笂鐨勪竴涓偣銆?騫抽潰涓婄殑榪欎釜鐐瑰氨鏄?P(x,y,z,1) - (nx,ny,nz,0)*D . 鍏朵腑D灝辨槸鐐筆鍒板鉤闈㈢殑璺濈 鑰孌=Plane dot P = (x*nx+y*ny+z*nz+d); 鐢變笂闈㈢殑鎻忚堪錛屾垜浠┈涓婃兂鍒幫紝閭d箞瑕佹眰鐐筆1鐨勮瘽錛屽氨鏄繖鏍?nbsp; (P+P1)/2 = P(x,y,z,1) - (nx,ny,nz,0)*D => P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*D =>P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*(x*nx+y*ny+z*nz+d) 鎹㈡垚鐭╅樀褰㈠紡鍒欎負(fù) 锝?-2*nx*nx -2*nx*ny -2*nx*nz 0 | | -2*ny*nx 1 - 2*ny*ny -2*ny*nz 0 | P1 = {x,y,z,1} x | -2*nz*nx -2*nz*ny 1-2*nz*nz 0 | | -2*d*nx -2*d*ny -2*d*nz 1 | 澶у姛鍛婃垚 btw:榪欐槸琛屼富鐭╅樀琛ㄧず娉?/p> 騫蟲(chóng)椂澶у浣跨敤 epoll 鏃墮兘鐭ラ亾鍏朵簨浠惰Е鍙戞ā寮忔湁榛樿鐨?level-trigger 妯″紡鍜岄氳繃 EPOLLET 鍚敤鐨?edge-trigger 妯″紡涓ょ銆備粠 epoll 鍙戝睍鍘嗗彶鏉ョ湅錛屽畠鍒氳癁鐢熸椂鍙湁 edge-trigger 妯″紡錛屽悗鏉ュ洜瀹規(guī)槗浜х敓 race-cond 涓斾笉鏄撹寮鍙戣呯悊瑙o紝鍙堝鍔犱簡(jiǎn) level-trigger 妯″紡騫朵綔涓洪粯璁ゅ鐞嗘柟寮忋?/span> 浜岃呯殑宸紓鍦ㄤ簬 level-trigger 妯″紡涓嬪彧瑕佹煇涓?fd 澶勪簬 readable/writable 鐘舵侊紝鏃犺浠涔堟椂鍊欒繘琛?epoll_wait 閮戒細(xì)榪斿洖璇?fd錛涜?edge-trigger 妯″紡涓嬪彧鏈夋煇涓?fd 浠?unreadable 鍙樹(shù)負(fù) readable 鎴栦粠 unwritable 鍙樹(shù)負(fù) writable 鏃訛紝epoll_wait 鎵嶄細(xì)榪斿洖璇?fd銆?/span> 閫氬父鐨勮鍖烘槸錛歭evel-trigger 妯″紡鍦?epoll 姹犱腑瀛樺湪澶ч噺 fd 鏃舵晥鐜囪鏄捐憲浣庝簬 edge-trigger 妯″紡銆?/strong> 浣嗕粠 kernel 浠g爜鏉ョ湅錛宔dge-trigger/level-trigger 妯″紡鐨勫鐞嗛昏緫鍑犱箮瀹屽叏鐩稿悓錛屽樊鍒粎鍦ㄤ簬 level-trigger 妯″紡鍦?event 鍙戠敓鏃朵笉浼?xì)灏嗗叾浠?ready list 涓Щ闄わ紝鐣ヤ負(fù)澧炲ぇ浜?event 澶勭悊榪囩▼涓?kernel space 涓褰曟暟鎹殑澶у皬銆?/span> 鐒惰岋紝edge-trigger 妯″紡涓瀹氳閰嶅悎 user app 涓殑 ready list 緇撴瀯錛屼互渚挎敹闆嗗凡鍑虹幇 event 鐨?fd錛屽啀閫氳繃 round-robin 鏂瑰紡鎸ㄤ釜澶勭悊錛屼互姝ら伩鍏嶉氫俊鏁版嵁閲忓緢澶ф椂鍑虹幇蹇欎簬澶勭悊鐑偣 fd 鑰屽鑷撮潪鐑偣 fd 楗挎鐨勭幇璞°傜粺瑙?kernel 鍜?user space錛岀敱浜?user app 涓?ready list 鐨勫疄鐜板崈濂囩櫨鎬紝涓嶄竴瀹氶兘緇忚繃浠旂粏鐨勬帹鏁蹭紭鍖栵紝鍥犳 edge-trigger 鐨勬誨唴瀛樺紑閿寰寰榪樺ぇ浜?level-trigger 鐨勫紑閿銆?/span> 涓鑸彿縐?edge-trigger 妯″紡鐨勪紭鍔垮湪浜庤兘澶熷噺灝?epoll 鐩稿叧緋葷粺璋冪敤錛岃繖璇濅笉鍋囷紝浣?user app 閲屽彲涓嶆槸鍙湁 epoll 鐩稿叧緋葷粺璋冪敤鍚э紵涓轟簡(jiǎn)緇曡繃楗挎闂錛宔dge-trigger 妯″紡鐨?user app 瑕佽嚜琛岃繘琛?read/write 寰幆澶勭悊錛岃繖鍏朵腑澧炲姞鐨勭郴緇熻皟鐢ㄥ拰鍑忓皯鐨?epoll 緋葷粺璋冪敤鍔犺搗鏉ワ紝鏈夎皝鑳借涓瀹氬氨鑳芥槑鏄懼湴蹇搗鏉ュ憿錛?/span> 瀹為檯涓婏紝epoll_wait 鐨勬晥鐜囨槸 O(ready fd num) 綰у埆鐨勶紝鍥犳 edge-trigger 妯″紡鐨勭湡姝d紭鍔垮湪浜庡噺灝戜簡(jiǎn)姣忔 epoll_wait 鍙兘闇瑕佽繑鍥炵殑 fd 鏁伴噺錛屽湪騫跺彂 event 鏁伴噺鏋佸鐨勬儏鍐典笅鑳藉姞蹇?epoll_wait 鐨勫鐞嗛熷害錛屼絾鍒繕?shù)簡(jiǎn)杩欏彧鏄拡瀵?epoll 浣撶郴鑷繁鑰岃█鐨勬彁鍗囷紝涓庢鍚屾椂 user app 闇瑕佸鍔犲鏉傜殑閫昏緫銆佽姳璐規(guī)洿澶氱殑 cpu/mem 涓庡叾閰嶅悎宸ヤ綔錛屾諱綋鎬ц兘鏀剁泭絀剁珶濡備綍錛熷彧鏈夊疄闄呮祴閲忔墠鐭ラ亾錛屾棤娉曚竴姒傝岃銆備笉榪囷紝涓轟簡(jiǎn)闄嶄綆澶勭悊閫昏緫澶嶆潅搴︼紝甯哥敤鐨勪簨浠跺鐞嗗簱澶ч儴鍒嗛兘閫夋嫨浜?level-trigger 妯″紡錛堝 libevent銆乥oost::asio絳夛級(jí) 緇撹錛?br style="margin: 0px; padding: 0px; " />• epoll 鐨?edge-trigger 鍜?level-trigger 妯″紡澶勭悊閫昏緫宸紓鏋佸皬錛屾ц兘嫻嬭瘯緇撴灉琛ㄦ槑甯歌搴旂敤鍦烘櫙 涓簩鑰呮ц兘宸紓鍙互蹇界暐銆?br style="margin: 0px; padding: 0px; " />• 浣跨敤 edge-trigger 鐨?user app 姣斾嬌鐢?level-trigger 鐨勯昏緫澶嶆潅錛屽嚭閿欐鐜囨洿楂樸?br style="margin: 0px; padding: 0px; " />• edge-trigger 鍜?level-trigger 鐨勬ц兘宸紓涓昏鍦ㄤ簬 epoll_wait 緋葷粺璋冪敤鐨勫鐞嗛熷害錛屾槸鍚︽槸 user app 鐨勬ц兘鐡墮闇瑕佽搴旂敤鍦烘櫙鑰屽畾錛屼笉鍙竴姒傝岃銆?/strong> 嬈㈣繋灝辨璇濋榪涜娣卞叆璋冪爺銆佽璁猴紒 鍙傝冭祫鏂欙細(xì) By QingWu 榪欓噷涓嶆槸涓昏璇村唴瀛樻睜錛屽彧鏄寰楄繖涓唴瀛樻睜涓殑鎸囬拡鐢ㄥ緱寰堥閫革紒 綆鍗曟彁紺轟竴涓嬶細(xì) unsigned char** next = (unsigned char**)mStartPotinter; mStartPotinter浣滀負(fù)浜岀淮鎸囬拡鐨勬椂鍊欙紝鐩稿綋浜庢槸涓緋誨垪鐨剈nsigned char* []. 瀵逛簬絎竴涓?*next 鐩稿綋浜?unsigned char*)mStartPointer[0]. 絎簩涓浉褰撲簬(unsigned char*)mStartPointer[sizeof(T)*1]; 絎笁涓浉褰撲簬(unsigned char*)mStartPointer[sizeof(T)*2]; 鎵浠ワ紝鏋勯燘LOCK涔嬮棿鍏崇郴鐨勬椂鍊欙紝涔熷彲浠ュ啓鎴?/p>
涓嶆兂澶氳В閲婁簡(jiǎn)錛岀瘡銆備及璁″鐪嬪嚑鍒嗙鍟ラ兘鏄庣櫧浜?jiǎn)锛?/p>
鍓栨瀽 epoll ET/LT 瑙﹀彂鏂瑰紡鐨勬ц兘宸紓璇В錛堝畾鎬у垎鏋愶級(jí)
• linux kernel source錛歠s/eventpoll.c
• “Comparing and Evaluating epoll, select, and poll Event
Mechanisms”錛歨ttp://bcr2.uwaterloo.ca/~brecht/papers/getpaper.php?file=ols-2004.pdf
• “Edge-triggered interfaces are too difficult?”錛歨ttp://lwn.net/Articles/25137/
/*
0 榛戣壊銆1銆娣辮摑銆錛掔豢銆錛撴祬钃?br> 錛旀殫綰€錛曟殫绱錛栧榛勩錛楁祬鐧?br> 錛樻祬鐏般錛欎寒钃濄錛戯紣浜豢銆錛戯紤闈炲父钃?br> 錛戯紥澶х孩銆錛戯紦浜傳銆錛戯紨榛勩錛戯紩鐧姐
*/
榪欐槸閭f浠g爜銆傛垜宸插仛鎴愪簡(jiǎn)ANSI鍜孶NICODE閮芥敮鎸佺殑鐗堟湰錛屽叿浣撲負(fù)浠涔堣榪欐牱錛屽彲浠ョ湅鍓嶄竴綃囧叧浜庡瓧絎︾紪鐮佷笌IO鐨勯棶棰樸?br>
void __Printfc(U16 color, const TCHAR* format,
) 
{
va_list argList;
U16 oldcolor;
HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bInfo;
GetConsoleScreenBufferInfo(hCon, &bInfo ); 
oldcolor = bInfo.wAttributes;
if(oldcolor!=color)
SetConsoleTextAttribute(hCon,color); 
#ifdef _UNICODE
_tsetlocale(LC_CTYPE,TEXT(""));
#endif
va_start( argList, format );
_tprintf( format,argList);
va_end( argList );
#ifdef _UNICODE
_tsetlocale(LC_CTYPE,TEXT("C"));
#endif
if(oldcolor!=color)
SetConsoleTextAttribute(hCon,color);
} 
鐢ㄧ櫨搴︽悳浜?jiǎn)涓涓嬭繖涓緭鍑洪棶棰橈紝紿佺劧鍙戠幇浜?jiǎn)鍏朵腑濂ュ锛屽師鏉nicode闇瑕佹湰鍦板寲淇℃伅銆?br>銆銆緇忔祴璇曞彂鐜頒簡(jiǎn)濡備笅瑙勫緥
/*
銆銆銆 C澶?nbsp;銆CU 銆銆闈濩澶?銆闈濩U
stdio 銆銆 1 銆銆0 銆銆銆1 銆銆銆1
iostream銆 1銆銆 1 銆銆銆0 銆銆銆 0
鍙互寰楀嚭
錛戙佸湪澶氬瓧鑺傛椂錛岄粯璁?C錛夐鏍間笅錛屼簩鑰呴兘鑳借緭鍑轟腑鏂囥?br>錛掋佸湪澶氬瓧鑺傛椂錛岄潪C椋庢牸涓嬶紝cout涓嶈兘杈撳嚭涓枃
錛撱佸湪U鏃訛紝榛樿C椋庢牸涓嬶紝print涓嶈兘杈撳嚭涓枃
錛斻佸湪U鏃訛紝闈濩椋庢牸涓嬶紝cout涓嶈兘杈撳嚭涓枃
鐢辨鍙煡錛岃鍦–椋庢牸涓嬶紝iostream鎵嶈兘杈撳嚭涓枃銆?br>鑰宲rintf鍙湁鍦–椋庢牸鐨刄nicode涓嬫墠涓嶈兘杈撳嚭涓枃錛屽叾瀹冨潎鍙?/font>
*/
嫻嬭瘯浠g爜濡備笅
#include <iostream>
#include <tchar.h>
#include <locale>
int _tmain(int argc, _TCHAR* argv[])
{
#ifdef _UNICODE
_tsetlocale(LC_CTYPE,TEXT(""));
#endif
_tprintf(TEXT("a鍦ㄥ摢閲屽晩\n"));
#ifdef _UNICODE
_tsetlocale(LC_CTYPE,TEXT("C"));
#endif
#ifdef _UNICODE
std::wcout<<"d鍦ㄥ摢閲屽晩"<<std::endl;
#else
std::cout<<"d鍦ㄥ摢閲屽晩"<<std::endl;
#endif
getchar();
return 0;
}
鍏朵腑涓夌淮妯″瀷瀵煎叆鏄敤OPENGL+GLUT+VS 2005
澧欎腑鍏富鍜?D璐铔囨槸鐢ㄧ殑D3DAPI+VC6.0 闃呰鍏ㄦ枃
榪欓噷鎴戠畝瑕佺殑鏍規(guī)嵁鑷繁鐨勭粡楠屽垪鍑?guó)櫚冭瘯涓瘮杈冨父鐢ㄧ殑鎶宸э紝甯屾湜瀵瑰ぇ瀹舵湁鐢ㄣ?nbsp; 闃呰鍏ㄦ枃
闃呰鍏ㄦ枃
闃呰鍏ㄦ枃
涓嶇煡閬撳悇浣嶆湁浣曢珮瑙侊紒
鎴戝績(jī)涓篃鏈変竴涓瓟妗堛備絾鍏堜笉璇達(dá)紝澶у涓璧鋒潵璁ㄨ銆傘傘?鍏卞悓瀹屾垚榪欑瘒璐村瓙銆?闅忓悗錛屽ぇ瀹剁殑楂樼鍥炲浼?xì)浠ュ涓嬫柟寮忓嚭鐜?
濡傛灉涓嶅笇鏈涙渶鍚庡嚭鐜板湪榪欓噷錛岃澶у娉ㄦ槑銆?榛樿鎯呭喌涓嬶紝琛ㄧず鍚屾剰錛?
ID錛歑XXX
瑙i噴錛?****************
=======================
ID錛歑XXXX
瑙i噴錛?******************* 闃呰鍏ㄦ枃
鎴戜滑闇瑕佸紕娓呬袱鐐癸細(xì)1銆乵ain鍑芥暟涓殑p涓嶮yNew鍑芥暟涓殑p鏄笉鏄竴鏍鳳紱2銆佸鏋滀笉涓鏍鳳紝鏄庝箞瀵艱嚧浜?jiǎn)涓嶄竴鏍風(fēng)殑銆?
闃呰鍏ㄦ枃
闃呰鍏ㄦ枃
template <class T,int AllocSize = 50>
2
class MemPool
3

{
4
public:
5
static void* operator new(size_t allocLength)
6
{
7
if(!mStartPotinter)
8
{
9
MyAlloc();
10
}
11
//灝嗗綋鍓嶆寚鍚戠┖闂插唴瀛樿搗濮嬪湴鍧浣滀負(fù)鍙嶅洖鍦板潃
12
unsigned char* p = mStartPotinter;
13
//鍙栧嚭絀洪棽鍖哄煙鍓?瀛楄妭鐨勫鹼紝璧嬪肩粰絀洪棽鍦板潃
14
//鍥犱負(fù)鍓嶅洓瀛楄妭涓瓨鏀句簡(jiǎn)涓嬩竴涓狟LOCK鐨勫湴鍧
15
mStartPotinter = *(unsigned char**)mStartPotinter;
16
return p;
17
}
18
19
static void operator delete(void* deleteP)
20
{
21
// assert(deletePointer);
22
*(unsigned char**)deleteP = mStartPotinter;
23
mStartPotinter = (unsigned char*)deleteP;
24
}
25
26
static void MyAlloc()
27
{
28
//棰勫垎閰嶅唴瀛?nbsp;
29
mStartPotinter = new unsigned char[sizeof(T)*AllocSize];
30
//鏋勯燘LOCK涔嬮棿鐨勫叧緋?nbsp;
31
//姣忎釜BLOCK鐨勫墠4BYTE瀛樻斁浜?jiǎn)涓嬩竴涓狟LOCK鐨勫湴鍧
32
unsigned char** next = (unsigned char**)mStartPotinter;
33
unsigned char* p = mStartPotinter;
34
35
for(int i = 0; i< AllocSize;++i)
36
{
37
p +=sizeof(T);//姝ヨ繘
38
*next = p;//璧嬪?nbsp;
39
next = (unsigned char**)p;//姝ヨ繘
40
}
41
*next = NULL;
42
}
43
44
static unsigned char* mStartPotinter;
45
};
46
47
template <class T,int AllocSize>
48
unsigned char* MemPool<T,AllocSize>::mStartPotinter = NULL;
49
50
51
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛歨ttp://blog.csdn.net/wqjqepr/archive/2010/05/03/5552322.aspx
for(int i = 0; i< AllocSize;++i)
2

{
3
p +=sizeof(T);//姝ヨ繘
4
unsigned char* pp = (unsigned char*)(p[sizeof(T)*i]);
5
pp = p;//璧嬪?nbsp;
6
}
1錛夋湁鎴愬憳鍙橀噺鐨勬儏鍐點(diǎn)?
2錛夋湁閲嶅緇ф壙鐨勬儏鍐點(diǎn)?
3錛夋湁铏氭嫙緇ф壙鐨勬儏鍐點(diǎn)?
4錛夋湁閽葷煶鍨嬭櫄鎷熺戶鎵跨殑鎯呭喌銆?
榪樻湁錛屽浜庡墠鍑犲ぉ鐨勮創(chuàng)瀛愯〃紺烘姤姝夛紝浠婂ぉ鏄洿鎺ヨ創(chuàng)鍒拌繖閲岀殑銆?娌′貢鐮侊紝榪樺ソ錛侊紒錛?nbsp; 闃呰鍏ㄦ枃
鍏充簬铏氬嚱鏁扮殑浣跨敤鏂規(guī)硶錛屾垜鍦ㄨ繖閲屼笉鍋氳繃澶氱殑闃愯堪銆傚ぇ瀹跺彲浠ョ湅鐪嬬浉鍏崇殑C++鐨勪功綾嶃傚湪榪欑瘒鏂囩珷涓紝鎴戝彧鎯充粠铏氬嚱鏁扮殑瀹炵幇鏈哄埗涓婇潰涓哄ぇ瀹?涓涓竻鏅扮殑鍓栨瀽銆?
褰撶劧錛岀浉鍚岀殑鏂囩珷鍦ㄧ綉涓婁篃鍑虹幇榪囦竴浜涗簡(jiǎn)錛屼絾鎴戞繪劅瑙夎繖浜涙枃绔犱笉鏄緢瀹規(guī)槗闃呰錛屽ぇ孌靛ぇ孌電殑浠g爜錛屾病鏈夊浘鐗囷紝娌℃湁璇︾粏鐨勮鏄庯紝娌℃湁姣旇緝錛屾病鏈変婦涓鍙嶄笁銆備笉鍒╀簬瀛︿範(fàn)鍜岄槄璇伙紝鎵浠ヨ繖鏄垜鎯沖啓涓嬭繖綃囨枃绔犵殑鍘熷洜銆備篃甯屾湜澶у澶氱粰鎴戞彁鎰忚銆?
璦褰掓浼狅紝璁╂垜浠竴璧瘋繘鍏ヨ櫄鍑芥暟鐨勪笘鐣屻?
铏氬嚱鏁拌〃
瀵笴++ 浜?jiǎn)瑙g殑錆h閮藉簲璇ョ煡閬撹櫄鍑芥暟錛圴irtual Function錛夋槸閫氳繃涓寮犺櫄鍑芥暟琛紙Virtual Table錛夋潵瀹炵幇鐨勩傜畝縐頒負(fù)V-Table銆?鍦ㄨ繖涓〃涓紝涓繪槸瑕佷竴涓被鐨勮櫄鍑芥暟鐨勫湴鍧琛紝榪欏紶琛ㄨВ鍐充簡(jiǎn)緇ф壙銆佽鐩栫殑闂錛屼繚璇佸叾瀹圭湡瀹炲弽搴斿疄闄呯殑鍑芥暟銆傝繖鏍鳳紝鍦ㄦ湁铏氬嚱鏁扮殑綾葷殑瀹炰緥涓繖涓〃琚垎閰嶅湪浜?榪欎釜瀹炰緥鐨勫唴瀛樹(shù)腑錛屾墍浠ワ紝褰撴垜浠敤鐖剁被鐨勬寚閽堟潵鎿嶄綔涓涓瓙綾葷殑鏃跺欙紝榪欏紶铏氬嚱鏁拌〃灝辨樉寰楃敱涓洪噸瑕佷簡(jiǎn)錛屽畠?yōu)鍍忎竴涓湴鍥句竴鏍鳳紝鎸囨槑浜?jiǎn)瀹為檯鎵搴旇璋冪敤鐨勫嚱鏁般?
榪欓噷鎴戜滑鐫閲嶇湅涓涓嬭繖寮犺櫄鍑芥暟琛ㄣ傚湪C++鐨勬爣鍑嗚鏍艱鏄庝功涓鍒幫紝緙栬瘧鍣ㄥ繀闇瑕佷繚璇佽櫄鍑芥暟琛ㄧ殑鎸囬拡瀛樺湪浜庡璞″疄渚嬩腑鏈鍓嶉潰鐨勪綅緗紙榪欐槸涓轟簡(jiǎn)淇濊瘉姝g‘鍙栧埌铏氬嚱鏁扮殑鍋忕Щ閲忥級(jí)銆?榪欐剰鍛崇潃鎴戜滑閫氳繃瀵硅薄瀹炰緥鐨勫湴鍧寰楀埌榪欏紶铏氬嚱鏁拌〃錛岀劧鍚庡氨鍙互閬嶅巻鍏朵腑鍑芥暟鎸囬拡錛屽茍璋冪敤鐩稿簲鐨勫嚱鏁般?
鍚垜鎵簡(jiǎn)閭d箞澶氾紝鎴戝彲浠ユ劅瑙夊嚭鏉ヤ綘鐜板湪鍙兘姣斾互鍓嶆洿鍔犳檿澶磋漿鍚戜簡(jiǎn)銆?娌″叧緋伙紝涓嬮潰灝辨槸瀹為檯鐨勪緥瀛愶紝鐩鎬俊鑱槑鐨勪綘涓鐪嬪氨鏄庣櫧浜?jiǎn)銆?
鍋囪鎴戜滑鏈夎繖鏍風(fēng)殑涓涓被錛?
class Base {
public:
virtual void f() { cout << "Base::f" << endl; }
virtual void g() { cout << "Base::g" << endl; }
virtual void h() { cout << "Base::h" << endl; }
};
鎸夌収涓婇潰鐨勮娉曪紝鎴戜滑鍙互閫氳繃Base鐨勫疄渚嬫潵寰楀埌铏氬嚱鏁拌〃銆?涓嬮潰鏄疄闄呬緥紼嬶細(xì)
typedef void(*Fun)(void);
Base b;
Fun pFun = NULL;
cout << "铏氬嚱鏁拌〃鍦板潃錛? << (int*)(&b) << endl;
cout << "铏氬嚱鏁拌〃 鈥?絎竴涓嚱鏁板湴鍧錛? << (int*)*(int*)(&b) << endl;
// Invoke the first virtual function
pFun = (Fun)*((int*)*(int*)(&b));
pFun();
瀹為檯榪愯緇忔灉濡備笅錛?Windows XP+VS2003, Linux 2.6.22 + GCC 4.1.3)
铏氬嚱鏁拌〃鍦板潃錛?012FED4
铏氬嚱鏁拌〃 鈥?絎竴涓嚱鏁板湴鍧錛?044F148
Base::f
閫氳繃榪欎釜紺轟緥錛屾垜浠彲浠ョ湅鍒幫紝鎴戜滑鍙互閫氳繃寮鴻鎶?amp;b杞垚int *錛屽彇寰楄櫄鍑芥暟琛ㄧ殑鍦板潃錛岀劧鍚庯紝鍐嶆鍙栧潃灝卞彲浠ュ緱鍒扮涓涓櫄鍑芥暟鐨勫湴鍧浜?jiǎn)锛屼篃灏辨槸Base::f()錛岃繖鍦ㄤ笂闈㈢殑紼嬪簭涓緱鍒頒簡(jiǎn)楠岃瘉錛堟妸int* 寮哄埗杞垚浜?jiǎn)鍑芥暟鎸囬拡锛?jí)銆傞氳繃榪欎釜紺轟緥錛屾垜浠氨鍙互鐭ラ亾濡傛灉瑕佽皟鐢˙ase::g()鍜孊ase::h()錛屽叾浠g爜濡備笅錛?
(Fun)*((int*)*(int*)(&b)+0); // Base::f()
(Fun)*((int*)*(int*)(&b)+1); // Base::g()
(Fun)*((int*)*(int*)(&b)+2); // Base::h()
榪欎釜鏃跺欎綘搴旇鎳備簡(jiǎn)鍚с備粈涔堬紵榪樻槸鏈夌偣鏅曘備篃鏄紝榪欐牱鐨勪唬鐮佺湅鐫澶貢浜?jiǎn)銆傛病闂錛岃鎴戠敾涓浘瑙i噴涓涓嬨傚涓嬫墍紺猴細(xì)
娉ㄦ剰錛氬湪涓婇潰榪欎釜鍥句腑錛屾垜鍦ㄨ櫄鍑芥暟琛ㄧ殑鏈鍚庡鍔犱簡(jiǎn)涓涓粨鐐癸紝榪欐槸铏氬嚱鏁拌〃鐨勭粨鏉熺粨鐐癸紝灝卞儚瀛楃涓茬殑緇撴潫絎?#8220;\0”涓鏍鳳紝鍏舵爣蹇椾簡(jiǎn)铏氬嚱鏁拌〃鐨勭粨鏉熴傝繖涓粨鏉熸爣蹇楃殑鍊煎湪涓嶅悓鐨勭紪璇戝櫒涓嬫槸涓嶅悓鐨勩傚湪WinXP+VS2003涓嬶紝榪欎釜鍊兼槸NULL銆傝屽湪Ubuntu 7.10 + Linux 2.6.22 + GCC 4.1.3涓嬶紝榪欎釜鍊兼槸濡傛灉1錛岃〃紺鴻繕鏈変笅涓涓櫄鍑芥暟琛紝濡傛灉鍊兼槸0錛岃〃紺烘槸鏈鍚庝竴涓櫄鍑芥暟琛ㄣ?
涓嬮潰錛屾垜灝嗗垎鍒鏄?#8220;鏃犺鐩?#8221;鍜?#8220;鏈夎鐩?#8221;鏃剁殑铏氬嚱鏁拌〃鐨勬牱瀛愩傛病鏈夎鐩栫埗綾葷殑铏氬嚱鏁版槸姣棤鎰忎箟鐨勩傛垜涔嬫墍浠ヨ璁茶堪娌℃湁瑕嗙洊鐨勬儏鍐碉紝涓昏鐩殑鏄負(fù)浜?jiǎn)缁欎竴涓姣斻傚湪姣旇緝涔嬩笅錛屾垜浠彲浠ユ洿鍔犳竻妤氬湴鐭ラ亾鍏跺唴閮ㄧ殑鍏蜂綋瀹炵幇銆?
涓鑸戶鎵匡紙鏃犺櫄鍑芥暟瑕嗙洊錛?br>涓嬮潰錛屽啀璁╂垜浠潵鐪嬬湅緇ф壙鏃剁殑铏氬嚱鏁拌〃鏄粈涔堟牱鐨勩傚亣璁炬湁濡備笅鎵紺虹殑涓涓戶鎵垮叧緋伙細(xì)
璇鋒敞鎰忥紝鍦ㄨ繖涓戶鎵垮叧緋諱腑錛屽瓙綾繪病鏈夐噸杞戒換浣曠埗綾葷殑鍑芥暟銆傞偅涔堬紝鍦ㄦ淳鐢熺被鐨勫疄渚嬩腑錛屽叾铏氬嚱鏁拌〃濡備笅鎵紺猴細(xì)
瀵逛簬瀹炰緥錛欴erive d; 鐨勮櫄鍑芥暟琛ㄥ涓嬶細(xì)
鎴戜滑鍙互鐪嬪埌涓嬮潰鍑犵偣錛?
1錛夎櫄鍑芥暟鎸夌収鍏跺0鏄庨『搴忔斁浜庤〃涓?
2錛夌埗綾葷殑铏氬嚱鏁板湪瀛愮被鐨勮櫄鍑芥暟鍓嶉潰銆?
鎴戠浉淇¤仾鏄庣殑浣犱竴瀹氬彲浠ュ弬鑰冨墠闈㈢殑閭d釜紼嬪簭錛屾潵緙栧啓涓孌電▼搴忔潵楠岃瘉銆?
涓鑸戶鎵匡紙鏈夎櫄鍑芥暟瑕嗙洊錛?br>瑕嗙洊鐖剁被鐨勮櫄鍑芥暟鏄緢鏄劇劧鐨勪簨鎯咃紝涓嶇劧錛岃櫄鍑芥暟灝卞彉寰楁鏃犳剰涔夈備笅闈紝鎴戜滑鏉ョ湅涓涓嬶紝濡傛灉瀛愮被涓湁铏氬嚱鏁伴噸杞戒簡(jiǎn)鐖剁被鐨勮櫄鍑芥暟錛屼細(xì)鏄竴涓粈涔堟牱瀛愶紵鍋囪錛屾垜浠湁涓嬮潰榪欐牱鐨勪竴涓戶鎵垮叧緋匯?
涓轟簡(jiǎn)璁╁ぇ瀹剁湅鍒拌緇ф壙榪囧悗鐨勬晥鏋滐紝鍦ㄨ繖涓被鐨勮璁′腑錛屾垜鍙鐩栦簡(jiǎn)鐖剁被鐨勪竴涓嚱鏁幫細(xì)f()銆傞偅涔堬紝瀵逛簬媧劇敓綾葷殑瀹炰緥錛屽叾铏氬嚱鏁拌〃浼?xì)鏄笅闈㈢殑涓涓牱瀛愶細(xì)
鎴戜滑浠庤〃涓彲浠ョ湅鍒頒笅闈㈠嚑鐐癸紝
1錛夎鐩栫殑f()鍑芥暟琚斁鍒頒簡(jiǎn)铏氳〃涓師鏉ョ埗綾昏櫄鍑芥暟鐨勪綅緗?
2錛夋病鏈夎瑕嗙洊鐨勫嚱鏁頒緷鏃с?
榪欐牱錛屾垜浠氨鍙互鐪嬪埌瀵逛簬涓嬮潰榪欐牱鐨勭▼搴忥紝
Base *b = new Derive();
b->f();
鐢眀鎵鎸囩殑鍐呭瓨?shù)腑鐨勮櫄鍑芥暟琛ㄧ殑f()鐨勪綅緗凡緇忚Derive::f()鍑芥暟鍦板潃鎵鍙栦唬錛屼簬鏄湪瀹為檯璋冪敤鍙戠敓鏃訛紝鏄疍erive::f()琚皟鐢ㄤ簡(jiǎn)銆傝繖灝卞疄鐜頒簡(jiǎn)澶氭併?
澶氶噸緇ф壙錛堟棤铏氬嚱鏁拌鐩栵級(jí)
涓嬮潰錛屽啀璁╂垜浠潵鐪嬬湅澶氶噸緇ф壙涓殑鎯呭喌錛屽亣璁炬湁涓嬮潰榪欐牱涓涓被鐨勭戶鎵垮叧緋匯傛敞鎰忥細(xì)瀛愮被騫舵病鏈夎鐩栫埗綾葷殑鍑芥暟銆?
瀵逛簬瀛愮被瀹炰緥涓殑铏氬嚱鏁拌〃錛屾槸涓嬮潰榪欎釜鏍峰瓙錛?
鎴戜滑鍙互鐪嬪埌錛?
1錛?姣忎釜鐖剁被閮芥湁鑷繁鐨勮櫄琛ㄣ?
2錛?瀛愮被鐨勬垚鍛樺嚱鏁拌鏀懼埌浜?jiǎn)绗竴涓埗綾葷殑琛ㄤ腑銆傦紙鎵璋撶殑絎竴涓埗綾繪槸鎸夌収澹版槑欏哄簭鏉ュ垽鏂殑錛?
榪欐牱鍋氬氨鏄負(fù)浜?jiǎn)瑙e喅涓嶅悓鐨勭埗绫痪c誨瀷鐨勬寚閽堟寚鍚戝悓涓涓瓙綾誨疄渚嬶紝鑰岃兘澶熻皟鐢ㄥ埌瀹為檯鐨勫嚱鏁般?
澶氶噸緇ф壙錛堟湁铏氬嚱鏁拌鐩栵級(jí)
涓嬮潰鎴戜滑鍐嶆潵鐪嬬湅錛屽鏋滃彂鐢熻櫄鍑芥暟瑕嗙洊鐨勬儏鍐點(diǎn)?
涓嬪浘涓紝鎴戜滑鍦ㄥ瓙綾諱腑瑕嗙洊浜?jiǎn)鐖毒c葷殑f()鍑芥暟銆?
涓嬮潰鏄浜庡瓙綾誨疄渚嬩腑鐨勮櫄鍑芥暟琛ㄧ殑鍥撅細(xì)
鎴戜滑鍙互鐪嬭錛屼笁涓埗綾昏櫄鍑芥暟琛ㄤ腑鐨刦()鐨勪綅緗鏇挎崲鎴愪簡(jiǎn)瀛愮被鐨勫嚱鏁版寚閽堛傝繖鏍鳳紝鎴戜滑灝卞彲浠ヤ換涓闈?rùn)鎬佺被鍨嬬殑鐖剁被鏉ユ寚鍚戝瓙綾伙紝騫惰皟鐢ㄥ瓙綾葷殑f()浜?jiǎn)銆傚錛?
Derive d;
Base1 *b1 = &d;
Base2 *b2 = &d;
Base3 *b3 = &d;
b1->f(); //Derive::f()
b2->f(); //Derive::f()
b3->f(); //Derive::f()
b1->g(); //Base1::g()
b2->g(); //Base2::g()
b3->g(); //Base3::g()
瀹夊叏鎬?br>姣忔鍐機(jī)++鐨勬枃绔狅紝鎬誨厤涓嶄簡(jiǎn)瑕佹壒鍒や竴涓婥++銆傝繖綃囨枃绔犱篃涓嶄緥澶栥傞氳繃涓婇潰鐨勮榪幫紝鐩鎬俊鎴戜滑瀵硅櫄鍑芥暟琛ㄦ湁涓涓瘮杈冪粏鑷寸殑浜?jiǎn)瑙d簡(jiǎn)銆傛按鍙澆鑸燂紝浜﹀彲瑕嗚垷銆備笅闈紝璁╂垜浠潵鐪嬬湅鎴戜滑鍙互鐢ㄨ櫄鍑芥暟琛ㄦ潵騫茬偣浠涔堝潖浜嬪惂銆?
涓銆侀氳繃鐖剁被鍨嬬殑鎸囬拡璁塊棶瀛愮被鑷繁鐨勮櫄鍑芥暟
鎴戜滑鐭ラ亾錛屽瓙綾繪病鏈夐噸杞界埗綾葷殑铏氬嚱鏁版槸涓浠舵鏃犳剰涔夌殑浜嬫儏銆傚洜涓哄鎬佷篃鏄鍩轟簬鍑芥暟閲嶈澆鐨勩傝櫧鐒跺湪涓婇潰鐨勫浘涓垜浠彲浠ョ湅鍒癇ase1鐨勮櫄琛ㄤ腑鏈塂erive鐨勮櫄鍑芥暟錛屼絾鎴戜滑鏍規(guī)湰涓嶅彲鑳戒嬌鐢ㄤ笅闈㈢殑璇彞鏉ヨ皟鐢ㄥ瓙綾葷殑鑷湁铏氬嚱鏁幫細(xì)
Base1 *b1 = new Derive();
b1->f1(); //緙栬瘧鍑洪敊
浠諱綍濡勫浘浣跨敤鐖剁被鎸囬拡鎯寵皟鐢ㄥ瓙綾諱腑鐨勬湭瑕嗙洊鐖剁被鐨勬垚鍛樺嚱鏁扮殑琛屼負(fù)閮戒細(xì)琚紪璇戝櫒瑙嗕負(fù)闈炴硶錛屾墍浠ワ紝榪欐牱鐨勭▼搴忔牴鏈棤娉曠紪璇戦氳繃銆備絾鍦ㄨ繍琛屾椂錛屾垜浠彲浠ラ氳繃鎸囬拡鐨勬柟寮忚闂櫄鍑芥暟琛ㄦ潵杈懼埌榪濆弽C++璇箟鐨勮涓恒傦紙鍏充簬榪欐柟闈㈢殑灝濊瘯錛岄氳繃闃呰鍚庨潰闄勫綍鐨勪唬鐮侊紝鐩鎬俊浣犲彲浠ュ仛鍒拌繖涓鐐癸級(jí)
浜屻佽闂畁on-public鐨勮櫄鍑芥暟
鍙﹀錛屽鏋滅埗綾葷殑铏氬嚱鏁版槸private鎴栨槸protected鐨勶紝浣嗚繖浜涢潪public鐨勮櫄鍑芥暟鍚屾牱浼?xì)瀛樺湪浜庤櫄鍑芥暟琛ㄤ腑锛屾墍浠ワ紝鎴戜滑鍚屾牱鍙互浣跨敤璁塊棶铏氬嚱鏁拌〃鐨勬柟寮忔潵璁塊棶榪欎簺non-public鐨勮櫄鍑芥暟錛岃繖鏄緢瀹規(guī)槗鍋氬埌鐨勩?
濡傦細(xì)
class Base {
private:
virtual void f() { cout << "Base::f" << endl; }
};
class Derive : public Base{
};
typedef void(*Fun)(void);
void main() {
Derive d;
Fun pFun = (Fun)*((int*)*(int*)(&d)+0);
pFun();
}
鍓嶄簺澶╋紝緙栫▼搴忔槸鐢ㄥ埌浜?jiǎn)寰堜箙浠ュ墠鍐欑殑C紼嬪簭錛屾兂鎶婇噷闈㈢殑鍑芥暟鍒╃敤璧鋒潵錛岃繛鎺ュ彂鐜板嚭鐜頒簡(jiǎn)鎵句笉鍒板叿浣撳嚱鏁扮殑閿欒錛?/p>
浠ヤ笅鏄亣璁炬棫鐨凜紼嬪簭搴?/p>
C鐨勫ご鏂囦歡
/*-----------c.h--------------*/
#ifndef _C_H_
#define _C_H_
extern int add(int x, int y);
#endif
C鐨勬簮鏂囦歡
/*-----------c.c--------------*/
int add(int x, int y){
return x+y;
}
C++鐨勮皟鐢?/p>
/*-----------cpp.cpp--------------*/
#include "c.h"
void main()
{
add(1, 0);
}
榪欐牱緙栬瘧浼?xì)漶旂敓閿欒cpp.obj : error LNK2001: unresolved external symbol "int __cdecl add(int,int)" (?add@@YAHHH@Z)錛屽師鍥犳槸鎵句笉鍒癮dd鐨勭洰鏍囨ā鍧?/p>
榪欐墠浠ゆ垜鎯寵搗C++閲嶈澆鐨勫嚱鏁板懡鍚嶆柟寮忓拰C鍑芥暟鐨勫懡鍚嶆柟寮忥紝璁╂垜浠洖欏句竴涓嬶細(xì)C涓嚱鏁扮紪璇戝悗鍛藉悕浼?xì)鍦ㄥ嚱鏁板悕鍓嶅姞浠?_",姣斿add鍑芥暟緙栬瘧鎴恛bj鏂囦歡鏃剁殑瀹為檯鍛藉悕涓篲add錛岃宑++鍛藉悕鍒欎笉鍚岋紝涓轟簡(jiǎn)瀹炵幇鍑芥暟閲嶈澆鍚屾牱鐨勫嚱鏁板悕add鍥犲弬鏁扮殑涓嶅悓浼?xì)琚~栬瘧鎴愪笉鍚岀殑鍚嶅瓧
渚嬪
int add(int , int)==>add@@YAHHH@Z,
float add(float , float )==>add@@YAMMM@Z,
浠ヤ笂鏄疺C6鐨勫懡鍚嶆柟寮忥紝涓嶅悓鐨勭紪璇戝櫒浼?xì)涓嶅悓锛屾諱箣涓嶅悓鐨勫弬鏁板悓鏍風(fēng)殑鍑芥暟鍚嶅皢緙栬瘧鎴愪笉鍚岀洰鏍囧悕錛屼互渚夸簬鍑芥暟閲嶈澆鏄皟鐢ㄥ叿浣撶殑鍑芥暟銆?/p>
緙栬瘧cpp.cpp涓紪璇戝櫒鍦╟pp鏂囦歡涓彂鐜癮dd(1, 0);鐨勮皟鐢ㄨ屽嚱鏁板0鏄庝負(fù)extern int add(int x, int y);緙栬瘧鍣ㄥ氨鍐沖畾鍘繪壘add@@YAHHH@Z錛屽彲鎯滀粬鎵句笉鍒幫紝鍥犱負(fù)C鐨勬簮鏂囦歡鎶?font color=#990000>extern int add(int x, int y);緙栬瘧鎴恄add浜?jiǎn)锛?/font>
涓轟簡(jiǎn)瑙e喅榪欎釜闂C++閲囩敤浜?jiǎn)extern "C",榪欏氨鏄垜浠殑涓婚錛屾兂瑕佸埄鐢ㄤ互鍓嶇殑C紼嬪簭搴擄紝閭d箞浣犲氨瑕佸浼?xì)瀹冨Q屾垜浠彲浠ョ湅浠ヤ笅鏍囧噯澶存枃浠朵綘浼?xì)鍙戠帋图屽緢澶氬ご鏂囦粔檭芥湁浠ヤ笅鐨劸l撴瀯
#ifndef __H
#define __H
#ifdef __cplusplus
extern "C" {
#endif
extern int f1(int, int);
extern int f2(int, int);
extern int f3(int, int);
#ifdef __cplusplus
}
#endif
#endif /*__H*/
濡傛灉鎴戜滑浠垮埗璇ュご鏂囦歡鍙互寰楀埌
#ifndef _C_H_
#define _C_H_
#ifdef __cplusplus
extern "C" {
#endif
extern int add(int, int);
#ifdef __cplusplus
}
#endif
#endif /* _C_H_ */
榪欐牱緙栬瘧
/*-----------c.c--------------*/
int add(int x, int y){
return x+y;
}
榪欐椂婧愭枃浠朵負(fù)*.c錛?/font>__cplusplus娌℃湁琚畾涔夛紝extern "C" {}榪欐椂娌℃湁鐢熸晥瀵逛簬C浠栫湅鍒板彧鏄?font color=#990000>extern int add(int, int);
add鍑芥暟緙栬瘧鎴恄add(int, int);
鑰岀紪璇慶++婧愭枃浠?/font>
/*-----------cpp.cpp--------------*/
#include "c.h"
void main()
{
add(1, 0);
}
榪欐椂婧愭枃浠朵負(fù)*.cpp,__cplusplus琚畾涔?瀵逛簬C++浠栫湅鍒扮殑鏄?font color=#990000>extern "C" {extern int add(int, int);}緙栬瘧鍣ㄥ氨浼?xì)鐭ラ?add(1, 0);璋冪敤鐨凜椋庢牸鐨勫嚱鏁幫紝灝變細(xì)鐭ラ亾鍘籧.obj涓壘_add(int, int)鑰屼笉鏄?/strong>add@@YAHHH@Z錛?/font>
濡傛灉 constantexpression 璁$畻緇撴灉涓洪潪闆跺鹼紝鍒欏鐞?!IF 鍜屼笅涓涓?!ELSE 鎴?!ENDIF 涔嬮棿鐨勮鍙ャ?br>!ENDIF
鏍囪 !IF銆?strong>!IFDEF 鎴?!IFNDEF 鍧楃殑緇撳熬銆傚悓涓琛屼笂 !ENDIF 鍚庨潰鐨勬墍鏈夋枃鏈蹇界暐銆?/p>
閫氳繃渚嬪瓙瀛︿範(fàn)Lua(1) ---- Hello World
1.鍓嶈█
娓告垙涓皯涓嶄簡(jiǎn)鐢ㄥ埌鑴氭湰璇█. Lua鏄竴縐嶅拰C/C++緇撳悎闈炲父绱у瘑鐨勮剼鏈璦錛屾晥鐜囨瀬楂樸?br>涓鑸槸瀵規(guī)椂闂磋姹傛瘮杈冮珮鐨勫湴鏂圭敤C++鍐欙紝鑰岀粡甯擱渶瑕佹敼鍔ㄧ殑鍦版柟鐢↙ua鍐欍?/p>
鍋舵渶榪戝湪瀛︿範(fàn)Lua, 鎵浠ュ啓鍑哄績(jī)寰楀拰澶у鍏變韓. Lua鏄竴縐嶅畬鍏ㄥ厤璐圭殑鑴氭湰璇█,
瀹冪殑瀹樻柟緗戠珯鍦?a >http://www.lua.org.鍦ㄧ綉绔欎笂鍙互涓嬭澆鍒發(fā)ua鐨勬簮鐮? 娌℃湁鍙?br>鎵ц鐗堟湰, 涓嶈繃涓嶇敤鎷呭績(jī), 鍥犱負(fù)lua婧愮爜鍙互鍦ㄤ換浣曚竴縐岰/C++鐨勭紪璇戝櫒涓婄紪璇?
濡傛灉瑕佸涔?fàn)Lua, 瀹樻柟緗戠珯涓婄殑Reference鏄繀澶囩殑錛屼笂闈㈡湁姣忎釜鍛戒護(hù)鐨勭敤娉曪紝闈炲父璇?br>緇嗐?br>鍙傝冩墜鍐?http://www.lua.org/manual/5.0/
浣滆呭啓鐨凱rogramming in Lua http://www.lua.org/pil/
2.緙栬瘧
濡傛灉鐢ㄧ殑VC, 鍙互涓嬭澆鎵闇鐨刾roject鏂囦歡,鍦板潃鍦?br>http://sourceforge.net/project/showfiles.php?group_id=32250&package_id=115604
鍋剁敤鐨勬槸cygwin鍜宭inux, 鎵撳叆浠ヤ笅鍛戒護(hù)鍗沖彲,
tar -zxvf lua-5.0.2.tar.gz
cd lua-5.0.2
sh ./configure
make
榪欐牱灝監(jiān)K浜?jiǎn)銆?br>涓轟簡(jiǎn)浠ュ悗浣跨敤鏂逛究錛屾渶濂芥妸bin鐩綍鍔犲叆鍒皃ath閲岄潰銆?/p>
3."Hello, world!"
鐜板湪寮濮嬪伓浠殑絎竴涓皬紼嬪簭"Hello, world!"
鎶婁互涓嬬▼搴忔墦鍏ユ枃浠秂01.lua
渚?:e01.lua
-- Hello World in Lua
print("Hello World.")
Lua鏈変袱縐嶆墽琛屾柟寮忥紝涓縐嶆槸宓屽叆鍒癈紼嬪簭涓墽琛岋紝榪樻湁涓縐嶆槸鐩存帴浠庡懡浠よ鏂瑰紡涓嬫墽
琛屻?br>榪欓噷涓轟簡(jiǎn)璋冭瘯鏂逛究錛岄噰鐢ㄧ浜岀鏂瑰紡錛屾墽琛屽懡浠?lua e01.lua
杈撳嚭緇撴灉搴旇鏄細(xì)
Hello World.
4.紼嬪簭璇存槑
絎竴琛?-- Hello World in Lua
榪欏彞鏄敞閲婏紝鍏朵腑--鍜孋++涓殑//鎰忔濇槸涓鏍風(fēng)殑
絎簩琛?print("Hello World.")
璋冪敤lua鍐呴儴鍛戒護(hù)print錛岃緭鍑?Hello World."瀛楃涓插埌灞忓箷錛孡ua涓殑瀛楃涓插叏閮ㄦ槸
鐢?鎷搗鏉ョ殑銆?br>榪欎釜鍛戒護(hù)鏄竴涓嚱鏁扮殑璋冪敤錛宲rint鏄痩ua鐨勪竴涓嚱鏁幫紝鑰?Hello World."鏄痯rint鐨勫弬
鏁般?/p>
5.璇曡瘯鐪?br>鍦↙ua涓湁涓嶅皯瀛楃涓茬殑澶勭悊鎿嶄綔錛屾湰嬈$殑璇懼悗璇曡瘯鐪嬬殑鍐呭灝辨槸錛屾壘鍑?guó)櫩炴帴涓や釜瀛椊W︿覆
鐨勬搷浣滐紝
騫朵笖print鍑烘潵銆?br>--
閫氳繃渚嬪瓙瀛︿範(fàn)Lua(2) --- Lua鍩虹
1. 鍑芥暟鐨勪嬌鐢?br>浠ヤ笅紼嬪簭婕旂ず浜?jiǎn)濡備綍鍦↙ua涓嬌鐢ㄥ嚱鏁? 鍙?qiáng)灞閮ㄥ彉閲?br>渚媏02.lua
-- functions
function pythagorean(a, b)
local c2 = a^2 + b^2
return sqrt(c2)
end
print(pythagorean(3,4))
榪愯緇撴灉
5
紼嬪簭璇存槑
鍦↙ua涓嚱鏁扮殑瀹氫箟鏍煎紡涓?
function 鍑芥暟鍚?鍙傛暟)
...
end
涓嶱ascal璇█涓嶅悓, end涓嶉渶瑕佷笌begin閰嶅, 鍙渶瑕佸湪鍑芥暟緇撴潫鍚庢墦涓猠nd灝卞彲浠ヤ簡(jiǎn).
鏈緥鍑芥暟鐨勪綔鐢ㄦ槸宸茬煡鐩磋涓夎褰㈢洿瑙掕竟, 姹傛枩杈歸暱搴? 鍙傛暟a,b鍒嗗埆琛ㄧず鐩磋杈歸暱,
鍦ㄥ嚱鏁板唴瀹氫箟浜?jiǎn)local褰㈠彉閲忕敤浜庡瓨鍌ㄦ枩杈圭殑騫蟲(chóng)柟. 涓嶤璇█鐩稿悓, 瀹氫箟鍦ㄥ嚱鏁板唴鐨勪唬
鐮佷笉浼?xì)琚洿鎺ユ墽琛? 鍙湁涓葷▼搴忚皟鐢ㄦ椂鎵嶄細(xì)琚墽琛?
local琛ㄧず瀹氫箟涓涓眬閮ㄥ彉閲? 濡傛灉涓嶅姞local鍒氳〃紺篶2涓轟竴涓叏灞鍙橀噺, local鐨勪綔鐢ㄥ煙
鏄湪鏈閲屽眰鐨別nd鍜屽叾閰嶅鐨勫叧閿瓧涔嬮棿, 濡俰f ... end, while ... end絳夈傚叏灞鍙橀噺
鐨?br>浣滅敤鍩熸槸鏁翠釜紼嬪簭銆?/p>
2. 寰幆璇彞
渚媏03.lua
-- Loops
for i=1,5 do
print("i is now " .. i)
end
榪愯緇撴灉
i is now 1
i is now 2
i is now 3
i is now 4
i is now 5
紼嬪簭璇存槑
榪欓噷鍋朵滑鐢ㄥ埌浜?jiǎn)for璇彞
for 鍙橀噺 = 鍙傛暟1, 鍙傛暟2, 鍙傛暟3 do
寰幆浣?br>end
鍙橀噺灝嗕互鍙傛暟3涓烘闀? 鐢卞弬鏁?鍙樺寲鍒板弬鏁?
渚嬪:
for i=1,f(x) do print(i) end
for i=10,1,-1 do print(i) end
榪欓噷print("i is now " .. i)涓紝鍋朵滑鐢ㄥ埌浜?.錛岃繖鏄敤鏉ヨ繛鎺ヤ袱涓瓧絎︿覆鐨勶紝
鍋跺湪(1)鐨勮瘯璇曠湅涓彁鍒扮殑錛屼笉鐭ラ亾浣犱滑絳斿浜?jiǎn)娌℃湁銆?br>铏界劧榪欓噷i鏄竴涓暣鍨嬮噺錛孡ua鍦ㄥ鐞嗙殑鏃跺欎細(xì)鑷姩杞垚瀛楃涓插瀷錛屼笉闇鍋朵滑璐瑰績(jī)銆?/p>
3. 鏉′歡鍒嗘敮璇彞
渚媏04.lua
-- Loops and conditionals
for i=1,5 do
print(“i is now “ .. i)
if i < 2 then
print(“small”)
elseif i < 4 then
print(“medium”)
else
print(“big”)
end
end
榪愯緇撴灉
i is now 1
small
i is now 2
medium
i is now 3
medium
i is now 4
big
i is now 5
big
紼嬪簭璇存槑
if else鐢ㄦ硶姣旇緝綆鍗? 綾諱技浜嶤璇█, 涓嶈繃姝ゅ闇瑕佹敞鎰忕殑鏄暣涓猧f鍙渶瑕佷竴涓猠nd,
鍝曠敤浜?jiǎn)澶氫釜elseif, 涔熸槸涓涓猠nd.
渚嬪
if op == "+" then
r = a + b
elseif op == "-" then
r = a - b
elseif op == "*" then
r = a*b
elseif op == "/" then
r = a/b
else
error("invalid operation")
end
4.璇曡瘯鐪?br>Lua涓櫎浜?jiǎn)for寰幆浠ュ, 榪樻敮鎸佸縐嶅驚鐜? 璇風(fēng)敤while...do鍜宺epeat...until鏀瑰啓鏈枃
涓殑for紼嬪簭
--
閫氳繃渚嬪瓙瀛︿範(fàn)Lua(3) ---- 鏁版嵁緇撴瀯
1.綆浠?
Lua璇█鍙湁涓縐嶅熀鏈暟鎹粨鏋? 閭e氨鏄痶able, 鎵鏈夊叾浠栨暟鎹粨鏋勫鏁扮粍鍟?
綾誨暒, 閮藉彲浠ョ敱table瀹炵幇.
2.table鐨勪笅鏍?
渚媏05.lua
-- Arrays
myData = {}
myData[0] = “foo”
myData[1] = 42
-- Hash tables
myData[“bar”] = “baz”
-- Iterate through the
-- structure
for key, value in myData do
print(key .. “=“ .. value)
end
杈撳嚭緇撴灉
0=foo
1=42
bar=baz
紼嬪簭璇存槑
棣栧厛瀹氫箟浜?jiǎn)涓涓猼able myData={}, 鐒跺悗鐢ㄦ暟瀛椾綔涓轟笅鏍囪祴浜?jiǎn)涓や釜鍊肩粰瀹? 榪欑
瀹氫箟鏂規(guī)硶綾諱技浜嶤涓殑鏁扮粍, 浣嗕笌鏁扮粍涓嶅悓鐨勬槸, 姣忎釜鏁扮粍鍏冪礌涓嶉渶瑕佷負(fù)鐩稿悓綾誨瀷,
灝卞儚鏈緥涓竴涓負(fù)鏁村瀷, 涓涓負(fù)瀛楃涓?
紼嬪簭絎簩閮ㄥ垎, 浠ュ瓧絎︿覆鍋氫負(fù)涓嬫爣, 鍙堝悜table鍐呭鍔犱簡(jiǎn)涓涓厓绱? 榪欑table闈炲父
鍍廠TL閲岄潰鐨刴ap. table涓嬫爣鍙互涓篖ua鎵鏀寔鐨勪換鎰忓熀鏈被鍨? 闄や簡(jiǎn)nil鍊間互澶?
Lua瀵筎able鍗犵敤鍐呭瓨鐨勫鐞嗘槸鑷姩鐨? 濡備笅闈㈣繖孌典唬鐮?
a = {}
a["x"] = 10
b = a -- `b' refers to the same table as `a'
print(b["x"]) --> 10
b["x"] = 20
print(a["x"]) --> 20
a = nil -- now only `b' still refers to the table
b = nil -- now there are no references left to the table
b鍜宎閮芥寚鍚戠浉鍚岀殑table, 鍙崰鐢ㄤ竴鍧楀唴瀛? 褰撴墽琛屽埌a = nil鏃? b浠嶇劧鎸囧悜table,
鑰屽綋鎵ц鍒癰=nil鏃? 鍥犱負(fù)娌℃湁鎸囧悜table鐨勫彉閲忎簡(jiǎn), 鎵浠ua浼?xì)鑷姩閲婃斁table鎵鍗犲唴瀛?
3.Table鐨勫祵濂?
Table鐨勪嬌鐢ㄨ繕鍙互宓屽錛屽涓嬩緥
渚媏06.lua
-- Table ‘constructor’
myPolygon = {
color=“blue”,
thickness=2,
npoints=4;
{x=0, y=0},
{x=-10, y=0},
{x=-5, y=4},
{x=0, y=4}
}
-- Print the color
print(myPolygon[“color”])
-- Print it again using dot
-- notation
print(myPolygon.color)
-- The points are accessible
-- in myPolygon[1] to myPolygon[4]
-- Print the second point’s x
-- coordinate
print(myPolygon[2].x)
紼嬪簭璇存槑
棣栧厛寤虹珛涓涓猼able, 涓庝笂涓渚嬩笉鍚岀殑鏄紝鍦╰able鐨刢onstructor閲岄潰鏈墈x=0,y=0},
榪欐槸浠涔堟剰鎬濆憿錛?榪欏叾瀹炲氨鏄竴涓皬table, 瀹氫箟鍦ㄤ簡(jiǎn)澶able涔嬪唴, 灝弔able鐨?
table鍚嶇渷鐣ヤ簡(jiǎn).
鏈鍚庝竴琛宮yPolygon[2].x錛屽氨鏄ぇtable閲岄潰灝弔able鐨勮闂柟寮?
--
閫氳繃渚嬪瓙瀛︿範(fàn)Lua(4) -- 鍑芥暟鐨勮皟鐢?
1.涓嶅畾鍙傛暟
渚媏07.lua
-- Functions can take a
-- variable number of
-- arguments.
function funky_print (...)
for i=1, arg.n do
print("FuNkY: " .. arg)
end
end
funky_print("one", "two")
榪愯緇撴灉
FuNkY: one
FuNkY: two
紼嬪簭璇存槑
* 濡傛灉浠?..涓哄弬鏁? 鍒欒〃紺哄弬鏁扮殑鏁伴噺涓嶅畾.
* 鍙傛暟灝嗕細(xì)鑷姩瀛樺偍鍒頒竴涓彨arg鐨則able涓?
* arg.n涓瓨鏀懼弬鏁扮殑涓暟. arg[]鍔犱笅鏍囧氨鍙互閬嶅巻鎵鏈夌殑鍙傛暟.
2.浠able鍋氫負(fù)鍙傛暟
渚媏08.lua
-- Functions with table
-- parameters
function print_contents(t)
for k,v in t do
print(k .. "=" .. v)
end
end
print_contents{x=10, y=20}
榪愯緇撴灉
x=10
y=20
紼嬪簭璇存槑
* print_contents{x=10, y=20}榪欏彞鍙傛暟娌″姞鍦嗘嫭鍙? 鍥犱負(fù)浠ュ崟涓猼able涓哄弬鏁扮殑鏃跺?
涓嶉渶瑕佸姞鍦嗘嫭鍙?
* for k,v in t do 榪欎釜璇彞鏄table涓殑鎵鏈夊奸亶鍘? k涓瓨鏀懼悕縐? v涓瓨鏀懼?
3.鎶奓ua鍙樻垚綾諱技XML鐨勬暟鎹弿榪拌璦
渚媏09.lua
function contact(t)
-- add the contact ‘t’, which is
-- stored as a table, to a database
end
contact {
name = "Game Developer",
email = "hack@ogdev.net",
url = "http://www.ogdev.net,
quote = [[
There are
10 types of people
who can understand binary.]]
}
contact {
-- some other contact
}
紼嬪簭璇存槑
* 鎶奻unction鍜宼able緇撳悎, 鍙互浣縇ua鎴愪負(fù)涓縐嶇被浼糥ML鐨勬暟鎹弿榪拌璦
* e09涓璫ontact{...}, 鏄竴縐嶅嚱鏁扮殑璋冪敤鏂規(guī)硶, 涓嶈寮勬販浜?
* [[...]]鏄〃紺哄琛屽瓧絎︿覆鐨勬柟娉?
* 褰撲嬌鐢– API鏃舵縐嶆柟寮忕殑浼樺娍鏇存槑鏄? 鍏朵腑contact{..}閮ㄥ垎鍙互鍙﹀瀛樻垚涓閰嶇疆鏂?
浠?
4.璇曡瘯鐪?
鎯蟲(chóng)兂鐪嬪摢浜涘湴鏂瑰彲浠ョ敤鍒頒緥e09涓彁鍒扮殑閰嶇疆鏂規(guī)硶鍛紵
--
閫氳繃渚嬪瓙瀛︿範(fàn)Lua(5) ---- Lua涓嶤浜や簰鍏ラ棬
1.綆浠?
Lua涓嶤/C++緇撳悎鏄緢绱у瘑鐨? Lua涓嶤++浜や簰鏄緩绔嬪湪Lua涓嶤鐨勫熀紜涓婄殑, 鎵
浠ュ伓鍏堜粠Lua涓嶤璁茶搗.
姝e絎竴璁叉墍璇? 榪愯Lua紼嬪簭鎴栬呰璋冪敤Lua涓昏鏈変袱縐嶆柟寮?
* 閫氳繃鍛戒護(hù)琛屾墽琛?Lua"鍛戒護(hù)
* 閫氳繃Lua鐨凜搴?
铏界劧姝ゅ墠鍋朵滑涓鐩寸敤絎竴縐嶆柟寮? 浣嗗伓瑕佸憡璇変綘, 閫氳繃Lua鐨凜搴撴墽琛屾墠鏄父鎴忎腑
甯哥敤鐨勬柟寮?
2.Lua鐨凜搴?
Lua鐨凜搴撳彲浠ュ仛涓篠hared Library璋冪敤, 浣嗕竴鑸紑鍙戞父鎴忔椂浼?xì)鎶奓ua鐨勬墍鏈夋簮紼嬪簭
閮藉寘鍚湪鍐? 騫朵笉鎶奓ua緙栬瘧鎴愬叡浜簱鐨勫艦寮? 鍥犱負(fù)Lua紼嬪簭鍙湁100澶欿, 鑰屼笖鍑犱箮
鍙互鍦ㄤ換浣曠紪璇戝櫒涓婥lean Compile. 甯ua婧愮▼搴忕殑鍙︿竴涓ソ澶勬椂, 鍙互闅忔椂瀵筁ua
鏈韓榪涜鎵╁厖, 澧炲姞鍋朵滑鎵闇鐨勫姛鑳?
Lua鐨凜搴撴彁渚涗竴緋誨垪API:
* 綆$悊鍏ㄥ眬鍙橀噺
* 綆$悊tables
* 璋冪敤鍑芥暟
* 瀹氫箟鏂板嚱鏁? 榪欎篃鍙互瀹屽叏鐢盋瀹炵幇
* 鍨冨溇鏀墮泦鍣℅arbage collector, 铏界劧Lua鍙互鑷姩榪涜, 浣嗗線寰涓嶆槸绔嬪嵆鎵ц鐨?
鎵浠ュ瀹炴椂鎬ц姹傛瘮杈冮珮鐨勭▼搴? 浼?xì)鑷忿p皟鐢ㄥ瀮鍦炬敹闆嗗櫒
* 杞藉叆騫舵墽琛孡ua紼嬪簭, 榪欎篃鍙互鐢盠ua鑷韓瀹炵幇
* 浠諱綍Lua鍙互瀹炵幇鐨勫姛鑳? 閮藉彲浠ラ氳繃Lua鐨凜 API瀹炵幇, 榪欏浜庝紭鍖栫▼搴忕殑榪愯閫熷害
鏈夊府鍔? 緇忓父璋冪敤鐨勫叡鐢ㄧ殑Lua紼嬪簭鐗囨柇鍙互杞垚C紼嬪簭, 浠ユ彁楂樻晥鐜? 榪濴ua閮芥槸C鍐欑殑
榪樻湁浠涔圕涓嶈兘瀹炵幇鍛?
3.Lua涓嶤闆嗘垚鐨勪緥瀛?
渚媏10.c
/* A simple Lua interpreter. */
#include <stdio.h>
#include <lua.h>
int main(int argc, char *argv[]) {
char line[BUFSIZ];
lua_State *L = lua_open(0);
while (fgets(line, sizeof(line), stdin) != 0)
lua_dostring(L, line);
lua_close(L);
return 0;
}
緙栬瘧
Linux/Cygwin
* 鍏堢紪璇慙ua, 騫舵妸澶存枃浠舵斁鍏nclude璺緞
* gcc e10.c -llua -llualib -o e10
VC6/VC2003
* 鍏堢紪璇慙ua, 鍦∣ption涓緗ご鏂囦歡鍜屽簱鏂囦歡璺緞
* 鏂板緩宸ョ▼,鍦ㄥ伐紼嬮厤緗腑鍔犲叆闄勫姞搴搇ua.lib鍜宭ualib.lib
* 緙栬瘧鎴恊xe
榪愯緇撴灉
鏈▼搴忕殑鍔熻兘鏄疄鐜頒竴涓狶ua瑙i噴鍣? 杈撳叆鐨勬瘡琛屽瓧絎﹂兘浼?xì)琚В閲婃垚Lua騫舵墽琛?
紼嬪簭璇存槑
* #include <lua.h> 鍖呭惈lua澶存枃浠? 鐒跺悗鎵嶅彲浠ヤ嬌鐢ˋPI
* lua_State *L = lua_open(0) 鎵撳紑涓涓狶ua鎵ц鍣?
* fgets(line, sizeof(line), stdin) 浠庢爣鍑嗚緭鍏ラ噷璇誨叆涓琛?
* lua_dostring(L, line) 鎵ц姝よ
* lua_close(L) 鍏抽棴Lua鎵ц鍣?
渚媏11.c
/* Another simple Lua interpreter. */
#include <stdio.h>
#include <lua.h>
#include <lualib.h>
int main(int argc, char *argv[]) {
char line[BUFSIZ];
lua_State *L = lua_open(0);
lua_baselibopen(L);
lua_iolibopen(L);
lua_strlibopen(L);
lua_mathlibopen(L);
while (fgets(line, sizeof(line), stdin) != 0)
lua_dostring(L, line);
lua_close(L);
return 0;
}
榪愯緇撴灉
鏈▼搴忕殑鍔熻兘鏄疄鐜頒竴涓狶ua瑙i噴鍣? 杈撳叆鐨勬瘡琛屽瓧絎﹂兘浼?xì)琚В閲婃垚Lua騫舵墽琛?
涓庝笂渚嬩笉鍚岀殑鏄? 鏈緥璋冪敤浜?jiǎn)Lua鐨勪竴浜涙爣鍑嗗簱.
紼嬪簭璇存槑
* #include <lualib.h> 鍖呭惈Lua鐨勬爣鍑嗗簱
* 浠ヤ笅榪欏嚑琛屾槸鐢ㄦ潵璇誨叆Lua鐨勪竴浜涘簱, 榪欐牱鍋朵滑鐨凩ua紼嬪簭灝卞彲浠ユ湁鏇村鐨勫姛鑳?
lua_baselibopen(L);
lua_iolibopen(L);
lua_strlibopen(L);
lua_mathlibopen(L);
4.璇曡瘯鐪?
鎶婁笂闈袱涓皬渚嬪瓙鍦ㄤ綘鐔熸?zhèn)夌殑缂栬瘧鍣ㄤ腑缂栬瘧鎵ц? 騫惰瘯璇曡兘鍚︿笌Lua婧愮爜鏍?wèi)涓璧風(fēng)紪璇?
--
閫氳繃渚嬪瓙瀛︿範(fàn)Lua(6) ---- C/C++涓敤Lua鍑芥暟
鍙傝冭嫳鏂囨枃妗ttp://tonyandpaige.com/tutorials/lua2.html
1.綆浠?
鍋朵滑榪欐涓昏璇磋鎬庝箞鐢盠ua瀹氫箟鍑芥暟, 鐒跺悗鍦–鎴栬匔++涓皟鐢? 榪欓噷鍋朵滑
鏆備笉娑夊強(qiáng)C++鐨勫璞¢棶棰? 鍙璁鴻皟鐢ㄥ嚱鏁扮殑鍙傛暟, 榪斿洖鍊煎拰鍏ㄥ眬鍙橀噺鐨勪嬌鐢?
2.
榪欓噷鍋朵滑鍦╡12.lua閲屽厛瀹氫箟涓涓畝鍗曠殑add(), x,y涓哄姞娉曠殑涓や釜鍙傛暟,
return 鐩存帴榪斿洖鐩稿姞鍚庣殑緇撴灉.
渚媏12.lua
-- add two numbers
function add ( x, y )
return x + y
end
鍦ㄥ墠涓嬈¢噷, 鍋朵滑璇村埌 lua_dofile() 鍙互鐩存帴鍦–涓墽琛宭ua鏂囦歡. 鍥犱負(fù)鍋朵滑
榪欎釜紼嬪簭閲屽彧瀹氫箟浜?jiǎn)涓涓猘dd()鍑芥暟, 鎵浠ョ▼搴忔墽琛屽悗騫朵笉鐩存帴緇撴灉, 鏁堟灉鐩稿綋
浜庡湪C涓畾涔変簡(jiǎn)涓涓嚱鏁頒竴鏍?
Lua鐨勫嚱鏁板彲浠ユ湁澶氫釜鍙傛暟, 涔熷彲浠ユ湁澶氫釜榪斿洖鍊? 榪欓兘鏄敱鏍?stack)瀹炵幇鐨?
闇瑕佽皟鐢ㄤ竴涓嚱鏁版椂, 灝辨妸榪欎釜鍑芥暟鍘嬪叆鏍? 鐒跺悗欏哄簭鍘嬪叆鎵鏈夊弬鏁? 鐒跺悗鐢?
lua_call()璋冪敤榪欎釜鍑芥暟. 鍑芥暟榪斿洖鍚? 榪斿洖鍊間篃鏄瓨鏀懼湪鏍堜腑. 榪欎釜榪囩▼鍜?
姹囩紪鎵ц鍑芥暟璋冪敤鐨勮繃紼嬫槸涓鏍風(fēng)殑.
渚媏13.cpp 鏄竴涓皟鐢ㄤ笂闈㈢殑Lua鍑芥暟鐨勪緥瀛?
#include <stdio.h>
extern "C" { // 榪欐槸涓狢++紼嬪簭, 鎵浠ヨextern "C",
// 鍥犱負(fù)lua鐨勫ご鏂囦歡閮芥槸C鏍煎紡鐨?
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
/* the Lua interpreter */
lua_State* L;
int luaadd ( int x, int y )
{
int sum;
/* the function name */
lua_getglobal(L, "add");
/* the first argument */
lua_pushnumber(L, x);
/* the second argument */
lua_pushnumber(L, y);
/* call the function with 2
arguments, return 1 result */
lua_call(L, 2, 1);
/* get the result */
sum = (int)lua_tonumber(L, -1);
lua_pop(L, 1);
return sum;
}
int main ( int argc, char *argv[] )
{
int sum;
/* initialize Lua */
L = lua_open();
/* load Lua base libraries */
lua_baselibopen(L);
/* load the script */
lua_dofile(L, "e12.lua");
/* call the add function */
sum = luaadd( 10, 15 );
/* print the result */
printf( "The sum is %d\n", sum );
/* cleanup Lua */
lua_close(L);
return 0;
}
紼嬪簭璇存槑:
main涓繃紼嬪伓浠笂嬈″凡緇忚榪囦簡(jiǎn), 鎵浠ヨ繖嬈″彧璇磋luaadd鐨勮繃紼?
* 棣栧厛鐢╨ua_getglobal()鎶奱dd鍑芥暟鍘嬫爤
* 鐒跺悗鐢╨ua_pushnumber()渚濇鎶妜,y鍘嬫爤
* 鐒跺悗璋冪敤lua_call(), 騫朵笖鍛婅瘔紼嬪簭鍋朵滑鏈変袱涓弬鏁頒竴涓繑鍥炲?
* 鎺ョ潃鍋朵滑浠庢爤欏跺彇鍥炶繑鍥炲? 鐢╨ua_tonumber()
* 鏈鍚庡伓浠敤lua_pop()鎶婅繑鍥炲兼竻鎺?
榪愯緇撴灉:
The sum is 25
緙栬瘧鏂規(guī)硶
Linux涓嬫妸紼嬪簭瀛樻垚e13.cpp
g++ e13.cpp -llua -llualib -o e13
./e13
VC涓嬬紪璇戞柟娉?
* 棣栧厛寤虹珛涓涓┖鐨刉in32 Console Application Project
* 鎶奺13.cpp鍔犲叆宸ョ▼涓?
* 鐐筽roject setting,鐒跺悗璁劇疆link閫夐」, 鍐嶅姞涓妉ua.lib lualib.lib涓や釜棰濆鐨勫簱
* 鏈鍚庣紪璇?
寤虹珛濂界殑project鍙互鍦ㄨ繖閲屼笅杞?
VC http://tonyandpaige.com/tutorials/luaadd.zip
Linux http://tonyandpaige.com/tutorials/luaadd.tar.gz
3.鍏ㄥ眬鍙橀噺
涓婇潰鍋朵滑鐢ㄥ埌浜?jiǎn)lua_getglobal()浣嗗茍娌℃湁璇︾粏璁? 榪欓噷鍋朵滑鍐嶄婦涓や釜灝忎緥瀛愭潵璇翠笅鍏ㄥ眬
鍙橀噺
lua_getglobal()鐨勪綔鐢ㄥ氨鏄妸lua涓叏灞鍙橀噺鐨勫煎帇鍏ユ爤
lua_getglobal(L, "z");
z = (int)lua_tonumber(L, 1);
lua_pop(L, 1);
鍋囪Lua紼嬪簭涓畾涔変簡(jiǎn)涓涓叏灞鍙橀噺z, 榪欐灝忕▼搴忓氨鏄妸z鐨勫煎彇鍑烘斁鍏鐨勫彉閲弞涓?
鍙﹀Lua涓繕鏈変竴涓搴旂殑鍑芥暟l(fā)ua_setglobal(), 浣滅敤鏄敤鏍堥《鐨勫煎~鍏呮寚瀹氱殑鍏ㄥ眬鍙?
閲?
lua_pushnumber(L, 10);
lua_setglobal(L, "z");
渚嬪榪欐灝忕▼搴忓氨鏄妸lua涓殑鍏ㄥ眬鍙橀噺z璁句負(fù)10, 濡傛灉lua涓湭瀹氫箟z鐨勮瘽, 灝變細(xì)鑷姩鍒?
寤轟竴涓?
鍏ㄥ眬鍙橀噺z騫惰涓?0.
4.璇曡瘯鐪?
鑷繁鍐欎釜鍑芥暟鐢–/C++鏉ヨ皟鐢ㄤ笅璇曡瘯
--
閫氳繃渚嬪瓙瀛︿範(fàn)Lua(7) ---- Lua涓皟鐢–/C++鍑芥暟
1.鍓嶈█
涓婃鍋惰鍒頒粠C/C++涓皟鐢↙ua鐨勫嚱鏁? 鐒跺悗灝辨湁鏈嬪弸闂粠Lua涓浣曡皟鐢–/C++鐨?
鍑芥暟, 鎵浠ュ伓浠繖嬈″氨鏉ヨ璇磋繖涓棶棰? 棣栧厛鍋朵滑浼?xì)鍦–++涓緩绔嬩竴涓嚱鏁? 鐒跺悗
鍛婄煡Lua鏈夎繖涓嚱鏁? 鏈鍚庡啀鎵ц瀹? 鍙﹀, 鐢變簬鍑芥暟涓嶆槸鍦↙ua涓畾涔夌殑, 鎵浠?
鏃犳硶紜畾鍑芥暟鐨勬紜? 鍙兘鍦ㄨ皟鐢ㄨ繃紼嬩腑浼?xì)鍑洪? 鍥犳鍋朵滑榪樹(shù)細(xì)璇磋Lua鍑洪敊澶?
鐞嗙殑闂.
2.Lua涓皟鐢–鍑芥暟
鍦╨ua涓槸浠ュ嚱鏁版寚閽堢殑褰㈠紡璋冪敤鍑芥暟, 騫朵笖鎵鏈夌殑鍑芥暟鎸囬拡閮藉繀欏繪弧瓚沖涓嬫縐?
綾誨瀷:
typedef int (*lua_CFunction) (lua_State *L);
涔熷氨鏄, 鍋朵滑鍦–++涓畾涔夊嚱鏁版椂蹇呴』浠ua_State涓哄弬鏁? 浠nt涓鴻繑鍥炲兼墠鑳?
琚獿ua鎵璋冪敤. 浣嗘槸涓嶈蹇樿浜? 鍋朵滑鐨刲ua_State鏄敮鎸佹爤鐨? 鎵浠ラ氳繃鏍堝彲浠?
浼犻掓棤絀蜂釜鍙傛暟, 澶у皬鍙彈鍐呭瓨澶у皬闄愬埗. 鑰岃繑鍥炵殑int鍊間篃鍙槸鎸囪繑鍥炲肩殑涓暟
鐪熸鐨勮繑鍥炲奸兘瀛樺偍鍦╨ua_State鐨勬爤涓? 鍋朵滑閫氬父鐨勫仛娉曟槸鍋氫竴涓獁rapper, 鎶?
鎵鏈夐渶瑕佽皟鐢ㄧ殑鍑芥暟閮絯rap涓涓? 榪欐牱灝卞彲浠ヨ皟鐢ㄤ換鎰忕殑鍑芥暟浜?
涓嬮潰榪欎釜渚嬪瓙鏄竴涓狢++鐨刟verage()鍑芥暟, 瀹冨皢灞曠ず濡備綍鐢ㄥ涓弬鏁板茍榪斿洖澶氫釜鍊?
渚媏14.cpp
#include <stdio.h>
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
/* the Lua interpreter */
lua_State* L;
static int average(lua_State *L)
{
/* get number of arguments */
int n = lua_gettop(L);
double sum = 0;
int i;
/* loop through each argument */
for (i = 1; i <= n; i++)
{
/* total the arguments */
sum += lua_tonumber(L, i);
}
/* push the average */
lua_pushnumber(L, sum / n);
/* push the sum */
lua_pushnumber(L, sum);
/* return the number of results */
return 2;
}
int main ( int argc, char *argv[] )
{
/* initialize Lua */
L = lua_open();
/* load Lua base libraries */
lua_baselibopen(L);
/* register our function */
lua_register(L, "average", average);
/* run the script */
lua_dofile(L, "e15.lua");
/* cleanup Lua */
lua_close(L);
return 0;
}
渚媏15.lua
-- call a C++ function
avg, sum = average(10, 20, 30, 40, 50)
print("The average is ", avg)
print("The sum is ", sum)
紼嬪簭璇存槑:
* lua_gettop()鐨勪綔鐢ㄦ槸榪斿洖鏍堥《鍏冪礌鐨勫簭鍙? 鐢變簬Lua鐨勬爤鏄粠1寮濮嬬紪鍙風(fēng)殑,
鎵浠ユ爤欏跺厓绱犵殑搴忓彿涔熺浉褰撲簬鏍堜腑鐨勫厓绱犱釜鏁? 鍦ㄨ繖閲? 鏍堜腑鍏冪礌鐨勪釜鏁板氨
鏄紶鍏ョ殑鍙傛暟涓暟.
* for寰幆璁$畻鎵鏈変紶鍏ュ弬鏁扮殑鎬誨拰. 榪欓噷鐢ㄥ埌浜?jiǎn)鏁板艱漿鎹ua_tonumber().
* 鐒跺悗鍋朵滑鐢╨ua_pushnumber()鎶婂鉤鍧囧煎拰鎬誨拰push鍒版爤涓?
* 鏈鍚? 鍋朵滑榪斿洖2, 琛ㄧず鏈変袱涓繑鍥炲?
* 鍋朵滑铏界劧鍦–++涓畾涔変簡(jiǎn)average()鍑芥暟, 浣嗗伓浠殑Lua紼嬪簭騫朵笉鐭ラ亾, 鎵浠ラ渶
瑕佸湪main鍑芥暟涓姞鍏?
/* register our function */
lua_register(L, "average", average);
榪欎袱琛岀殑浣滅敤灝辨槸鍛婅瘔e15.lua鏈塧verage()榪欐牱涓涓嚱鏁?
* 榪欎釜紼嬪簭鍙互瀛樻垚cpp涔熷彲浠ュ瓨鎴恈, 濡傛灉浠?c涓烘墿灞曞悕灝變笉闇瑕佸姞extern "C"
緙栬瘧鐨勬柟娉曞伓浠笂嬈¤榪囦簡(jiǎn), 鏂規(guī)硶鐩稿悓.
e15.lua鎵ц鐨勬柟娉曞彧鑳界敤涓婁緥涓殑C++涓墽琛? 鑰屼笉鑳界敤鍛戒護(hù)琛屾柟寮忔墽琛?
3.閿欒澶勭悊
鍦ㄤ笂渚嬩腑, 鍋朵滑娌℃湁瀵逛紶鍏ョ殑鍙傛暟鏄惁涓烘暟瀛楄繘琛屾嫻? 榪欐牱鍋氫笉濂? 鎵浠ヨ繖閲屽伓
浠啀鍔犱笂閿欒澶勭悊鐨勭墖鏂?
鎶婅繖孌靛姞鍦╢or寰幆涔嬪唴:
if (!lua_isnumber(L, i)) {
lua_pushstring(L, "Incorrect argument to 'average'");
lua_error(L);
}
榪欐鐨勪綔鐢ㄥ氨鏄嫻嬩紶鍏ョ殑鏄惁涓烘暟瀛?
鍔犱笂榪欐涔嬪悗, 鍋朵滑debug鐨勬椂鍊欏氨浼?xì)绠鍗曡澶? 瀵逛簬緇撳悎涓ょ璇█鐨勭紪紼? 瀹冧滑涔?
闂翠紶閫掓暟鎹殑姝g‘鎬ф嫻嬫槸闈炲父閲嶈鐨?
榪欓噷鏈夊埆浜哄啓濂界殑渚嬪瓙:
VC鐨?http://tonyandpaige.com/tutorials/luaavg.zip
Linux鐨?http://tonyandpaige.com/tutorials/luaavg.tar.gz
鑷蟲(chóng), Lua涓嶤鐨勭粨鍚堝氨鍩烘湰璁插畬浜? 涓嬫鍋惰寮濮嬭璇碙ua涓庨潰鍚戝璞?
浣嗘槸鍋惰嚜宸辮繕娌℃湁瀛﹀畬, 鎵浠ュぇ瀹跺彲鑳借澶氱瓑涓ゅぉ浜? Sorry!
--
//鐢ㄤ簬2瀛楄妭錛圖WORD)鏁版嵁濉厖鐨勫嚱鏁?br>inline void Mem_Set_WORD(VOID *dest, USHORT data, int count )
{
_asm
{
mov edi, dest ; edi鎸囧悜鐩爣鍐呭瓨
銆銆銆銆銆 mov ecx, count ;瑕佺Щ鍔ㄧ殑16浣嶅瓧鏁?br>銆銆銆銆銆 mov ax, data ;16浣嶆暟鎹?br>銆銆銆銆銆 rep stosw ;縐誨姩鏁版嵁
銆銆銆銆銆锝?/end asm
}//end Mem_Set_WORD
int Partition(int a[],int l,int r)
{
int p = a[l];//鍙栭鍏冪礌浣滀負(fù)鍒掑垎鐐?/p>
while(l<r)
{
while(l<r&& a[r]>=p)
--r;
a[l] = a[r];
while(l<r&& a[l]<=p)
++l;
a[r] = a[l];
}
a[l] = p;
return l;
}
void QSort(int a[],int l,int r)
{
int p;
if(l<r)
{
p = Partition(a,l,r);
for(int i = l; i< r;++i)
{
cout<<a[i]<<" ";
}
cout<<endl;
QSort(a,l,p-1);
QSort(a,p+1,r);
}
}