锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍑芥暟杈撳嚭鎴浘濡備笅錛?br /> 鑰屽鏋滄妸operator*鎹㈡垚鍙︿竴縐嶅艦寮忥細 Copy On Write錛堝啓鏃跺鍒訛級鏄湪緙栫▼涓瘮杈冨父瑙佺殑涓涓妧鏈紝闈㈣瘯涓篃浼氬伓灝斿嚭鐜幫紙濂藉儚Java涓氨緇忓父鏈夊瓧絎︿覆鍐欐椂澶嶅埗鐨勭瑪璇曢錛夛紝浠婂ぉ鍦ㄧ湅銆奙ore Effective C++銆嬬殑寮曠敤璁℃暟鏃跺氨璁插埌浜咰opy On Write——鍐欐椂澶嶅埗銆備笅闈㈢畝鍗曚粙緇嶄笅Copy On Write(鍐欐椂澶嶅埗)錛屾垜浠亣璁維TL涓殑string鏀寔鍐欐椂澶嶅埗錛堝彧鏄亣璁撅紝鍏蜂綋鏈粡鑰冭瘉錛岃繖閲屼互Mircosoft Visual Studio 6.0涓轟緥錛屽鏋滄湁鍏磋叮錛屽彲浠ヨ嚜宸辯炕闃呮簮鐮侊級 Copy On Write(鍐欐椂澶嶅埗)鐨勫師鐞嗘槸浠涔堬紵 浠涔堟儏鍐典笅瑙﹀彂Copy On Write(鍐欐椂澶嶅埗) 紺轟緥浠g爜錛?br /> 鎷撳睍闃呰錛氾紙鎽樿嚜銆奧indows Via C/C++銆?th Edition錛屼笉鎯崇湅鑻辨枃鍙互鐪嬩腑鏂囩殑PDF錛屼腑鏂囩増絎?42欏碉級
榪斿洖鍊間紭鍖栵紙Return Value Optimization錛岀畝縐癛VO錛夛紝鏄繖涔堜竴縐嶄紭鍖栨満鍒訛細褰撳嚱鏁伴渶瑕佽繑鍥炰竴涓璞$殑鏃跺欙紝濡傛灉鑷繁鍒涘緩涓涓復鏃跺璞$敤鎴瘋繑鍥烇紝閭d箞榪欎釜涓存椂瀵硅薄浼氭秷鑰椾竴涓瀯閫犲嚱鏁幫紙Constructor錛夌殑璋冪敤銆佷竴涓鍒舵瀯閫犲嚱鏁扮殑璋冪敤錛圕opy Constructor錛変互鍙婁竴涓瀽鏋勫嚱鏁幫紙Destructor錛夌殑璋冪敤鐨勪唬浠楓傝屽鏋滅◢寰仛涓鐐逛紭鍖栵紝灝卞彲浠ュ皢鎴愭湰闄嶄綆鍒頒竴涓瀯閫犲嚱鏁扮殑浠d環錛屼笅闈㈡槸鍦╒isual Studio 2008鐨凞ebug妯″紡涓嬪仛鐨勪竴涓祴璇曪細錛堝湪GCC涓嬫祴璇曠殑鏃跺欏彲鑳界紪璇戝櫒鑷繁榪涜浜哛VO浼樺寲錛岀湅涓嶅埌涓ょ浠g爜鐨勫尯鍒級
2 // 浣滆咃細浠g爜鐤瓙
3 // 鍗氬錛?/span>http://www.programlife.net/
4 #include <iostream>
5 using namespace std;
6
7 class Rational
8 {
9 public:
10 Rational(int numerator = 0, int denominator = 1) :
11 n(numerator), d(denominator)
12 {
13 cout << "Constructor Called
" << endl;
14 }
15 ~Rational()
16 {
17 cout << "Destructor Called
" << endl;
18 }
19 Rational(const Rational& rhs)
20 {
21 this->d = rhs.d;
22 this->n = rhs.n;
23 cout << "Copy Constructor Called
" << endl;
24 }
25 int numerator() const { return n; }
26 int denominator() const { return d; }
27 private:
28 int n, d;
29 };
30
31 //const Rational operator*(const Rational& lhs,
32 // const Rational& rhs)
33 //{
34 // return Rational(lhs.numerator() * rhs.numerator(),
35 // lhs.denominator() * rhs.denominator());
36 //}
37
38 const Rational operator*(const Rational& lhs,
39 const Rational& rhs)
40 {
41 cout << "----------- Enter operator* -----------" << endl;
42 Rational tmp(lhs.numerator() * rhs.numerator(),
43 lhs.denominator() * rhs.denominator());
44 cout << "----------- Leave operator* -----------" << endl;
45 return tmp;
46 }
47
48 int main(int argc, char **argv)
49 {
50 Rational x(1, 5), y(2, 9);
51 Rational z = x * y;
52 cout << "calc result: " << z.numerator()
53 << "/" << z.denominator() << endl;
54
55 return 0;
56 }
鍙互鐪嬪埌娑堣椾竴涓瀯閫犲嚱鏁幫紙Constructor錛夌殑璋冪敤銆佷竴涓鍒舵瀯閫犲嚱鏁扮殑璋冪敤錛圕opy Constructor錛変互鍙婁竴涓瀽鏋勫嚱鏁幫紙Destructor錛夌殑璋冪敤鐨勪唬浠楓?/p>
2 const Rational& rhs)
3 {
4 return Rational(lhs.numerator() * rhs.numerator(),
5 lhs.denominator() * rhs.denominator());
6 }
灝卞彧浼氭秷鑰椾竴涓瀯閫犲嚱鏁扮殑鎴愭湰浜嗭細
]]>
鏈変竴瀹氱粡楠岀殑紼嬪簭鍛樺簲璇ラ兘鐭ラ亾Copy On Write(鍐欐椂澶嶅埗)浣跨敤浜?#8220;寮曠敤璁℃暟”錛屼細鏈変竴涓彉閲忕敤浜庝繚瀛樺紩鐢ㄧ殑鏁伴噺銆傚綋絎竴涓被鏋勯犳椂錛宻tring鐨勬瀯閫犲嚱鏁頒細鏍規嵁浼犲叆鐨勫弬鏁頒粠鍫嗕笂鍒嗛厤鍐呭瓨錛屽綋鏈夊叾瀹冪被闇瑕佽繖鍧楀唴瀛樻椂錛岃繖涓鏁頒負鑷姩绱姞錛屽綋鏈夌被鏋愭瀯鏃訛紝榪欎釜璁℃暟浼氬噺涓錛岀洿鍒版渶鍚庝竴涓被鏋愭瀯鏃訛紝姝ゆ椂鐨勫紩鐢ㄨ鏁頒負1鎴栨槸0錛屾鏃訛紝紼嬪簭鎵嶄細鐪熸鐨凢ree榪欏潡浠庡爢涓婂垎閰嶇殑鍐呭瓨銆?br />寮曠敤璁℃暟灝辨槸string綾諱腑鍐欐椂鎵嶆嫹璐濈殑鍘熺悊錛?/p>
寰堟樉鐒訛紝褰撶劧鏄湪鍏變韓鍚屼竴鍧楀唴瀛樼殑綾誨彂鐢熷唴瀹規敼鍙樻椂錛屾墠浼氬彂鐢烠opy On Write(鍐欐椂澶嶅埗)銆傛瘮濡俿tring綾葷殑[]銆?銆?=銆?絳夛紝榪樻湁涓浜泂tring綾諱腑璇稿insert銆乺eplace銆乤ppend絳夋垚鍛樺嚱鏁扮瓑錛屽寘鎷被鐨勬瀽鏋勬椂銆?/p>// 浣滆咃細浠g爜鐤瓙
// 鍗氬錛歨ttp://www.programlife.net/
// 寮曠敤璁℃暟 & 鍐欐椂澶嶅埗
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)
{
string sa = "Copy on write";
string sb = sa;
string sc = sb;
printf("sa char buffer address: 0x%08X\n", sa.c_str());
printf("sb char buffer address: 0x%08X\n", sb.c_str());
printf("sc char buffer address: 0x%08X\n", sc.c_str());
sc = "Now writing..."; printf("After writing sc:\n");
printf("sa char buffer address: 0x%08X\n", sa.c_str());
printf("sb char buffer address: 0x%08X\n", sb.c_str());
printf("sc char buffer address: 0x%08X\n", sc.c_str());
return 0;
}
鍙互鐪嬪埌錛孷C6閲岄潰鐨剆tring鏄敮鎸佸啓鏃跺鍒剁殑錛屼絾鏄垜鐨刅isual Studio 2008灝變笉鏀寔榪欎釜鐗規э紙Debug鍜孯elease閮芥槸錛夛細
Static Data Is Not Shared by Multiple Instances of an Executable or a DLL
]]>
# 鎵撳紑杞歡婧愰厤緗枃浠舵坊鍔犱笅闈?琛?/span>
sudo gedit /etc/apt/sources.list
deb http://apt.jenslody.de/ any main
deb-src http://apt.jenslody.de/ any main
deb http://apt.jenslody.de/ any release
deb-src http://apt.jenslody.de/ any release
deb http://apt.wxwidgets.org/ lenny-wx main
# 鏇存柊杞歡婧愰厤緗枃浠?鍜?瀹夎Key
sudo apt-get update
sudo apt-get install jens-lody-debian-keyring
wget -q http://apt.wxwidgets.org/key.asc -O- | sudo apt-key add -
榪欐牱鍙槸鎶婅蔣浠舵簮瀹惰繘鍘諱簡錛屽茍娌℃湁瀹夎濂斤紝鎵浠ヨ繕瑕佽緭鍏ュ畨瑁呭懡浠?/span>
# 鐒跺悗杈撳叆涓嬮潰榪欎釜鍛戒護寮濮嬪畨瑁?codeblocks
sudo apt-get install codeblocks
鐜板湪瀹夎濂斤紝浠庣紪紼嬭蔣浠墮噷寮鍚疌odeBlocks浜嗭紝鏄嫳鏂囩殑錛屽茍涓旀槸鏈榪戝嚑鏃ョ殑鏈鐗堟湰
# 浣犱篃鍙互鐩存帴涓嬭澆 CodeBlocks 鐨勪簩榪涘埗鍙戣鍖咃紝浠庤繖涓猆RL榪涘叆
http://apt.jenslody.de/pool/
# 涓枃鍖朇odeBlocks 涓嬭澆榪欎釜鍖咃紝璇█鏂囦歡 Linux涓嬮氱敤鐨?/span>
http://srgb.googlecode.com/files/CodeBlocks_Linux_Install.zip
榪涘叆鍘嬬緝鍖呮妸璇█鏂囦歡鏀懼埌妗岄潰 '/locale/zh_CN/CodeBlocks.mo'
涓枃鍖?codeblocks locale/zh_CN/codeblocks.mo 閲岀殑 涓枃鍖栨枃浠舵斁榪欓噷
'/usr/share/codeblocks/locale/zh_CN/codeblocks.mo'
璁劇疆鏉冮檺涓烘墍鏈変漢鍙互璁塊棶

# 浣跨敤綆$悊鍛樻潈闄愭妸 璇█鍖?locale 鐩綍 鎷夊埌 /usr/share/codeblocks閲?/span>
sudo nautilus /usr/share/codeblocks/
娉ㄦ剰 locale 鐨勬潈闄愬彲鑳戒笉瀹屾暣錛屾墍浠?閫変綇鐩綍 鎵鏈夎?緹ょ粍-鍏朵粬璁懼畾閮借兘璁塊棶鏂囦歡;
瀵瑰寘鍚殑鏂囦歡搴旂敤鏉冮檺錛?/span>
榪涘叆 /usr/share/codeblocks/locale/zh_CN/ 鐩綍閫変袱涓枃浠?/span>
鍙抽敭淇敼鏉冮檺 鎵鏈夎?鍜?緹ょ粍 閮藉彲浠ヨ鍐?/span>

鐜板湪瀹夎鐨?CodeBlocks 鎵撳紑鏄腑鏂囬噷錛屼絾鏄彧鏈夊熀鏈琁DE鐜錛屽緢澶氭彃浠跺拰寮鍙戝寘娌″畨瑁?/span>
鍙互杈撳叆 sudo apt-get install codeblocks <鎸変袱涓婽AB>
鍒楀嚭娌℃湁瀹夎鐨勫叾浠栧寘錛?浣犲彲浠ラ夋嫨瀹夎錛屾垜鍋鋒噿浜?/span>
sudo apt-get install codeblocks* <鍥炶濺>
sudo apt-get install libwxsmith* <鍥炶濺>
sudo apt-get install libwxgtk2.8-dev <鍥炶濺>
鐜板湪寮鍚疌B錛屽緩绔嬩竴涓獁x欏圭洰錛岀紪璇戯紝鍙互緙栬瘧鎴愬姛浜?/span>
]]>
1 #include <lua.hpp>
2 #include <lauxlib.h>
3 #include <lualib.h>
4 #include <limits.h>
5
6 #define BITS_PER_WORD (CHAR_BIT * sizeof(int))
7 #define I_WORD(i) ((unsigned int)(i))/BITS_PER_WORD
8 #define I_BIT(i) (1 << ((unsigned int)(i)%BITS_PER_WORD))
9
10 typedef struct NumArray {
11 int size; 12 unsigned int values[1];
13 } NumArray;
14
15 extern "C" int newArray(lua_State* L)
16 {
17 //1. 媯鏌ョ涓涓弬鏁版槸鍚︿負鏁村瀷銆備互鍙婅鍙傛暟鐨勫兼槸鍚﹀ぇ浜庣瓑浜?.
18 int n = luaL_checkint(L,1);
19 luaL_argcheck(L, n >= 1, 1, "invalid size.");
20 size_t nbytes = sizeof(NumArray) + I_WORD(n - 1) * sizeof(int);
21 //2. 鍙傛暟琛ㄧずLua涓簎serdata鍒嗛厤鐨勫瓧鑺傛暟銆傚悓鏃跺皢鍒嗛厤鍚庣殑userdata瀵硅薄鍘嬪叆鏍堜腑銆?/span>
22 NumArray* a = (NumArray*)lua_newuserdata(L,nbytes);
23 a->size = n;
24 for (int i = 0; i < I_WORD(n - 1); ++i)
25 a->values[i] = 0;
26 //鑾峰彇娉ㄥ唽琛ㄥ彉閲弇yarray錛岃key鐨勫間負metatable銆?/span>
27 luaL_getmetatable(L,"myarray");
28 //灝唘serdata鐨勫厓琛ㄨ緗負鍜宮yarray鍏寵仈鐨則able銆傚悓鏃跺皢鏍堥《鍏冪礌寮瑰嚭銆?/span>
29 lua_setmetatable(L,-2);
30 return 1;
31 }
32
33 extern "C" int setArray(lua_State* L)
34 {
35 //1. Lua浼犵粰璇ュ嚱鏁扮殑絎竴涓弬鏁板繀欏繪槸userdata錛岃瀵硅薄鐨勫厓琛ㄤ篃蹇呴』鏄敞鍐岃〃涓拰myarray鍏寵仈鐨則able銆?
36 //鍚﹀垯璇ュ嚱鏁版姤閿欏茍緇堟紼嬪簭銆?/span>
37 NumArray* a = (NumArray*)luaL_checkudata(L,1,"myarray");
38 int index = luaL_checkint(L,2) - 1;
39 //2. 鐢變簬浠諱綍綾誨瀷鐨勬暟鎹兘鍙互鎴愪負甯冨皵鍊鹼紝鍥犳榪欓噷浣跨敤any鍙槸涓轟簡紜繚鏈?涓弬鏁般?/span>
40 luaL_checkany(L,3);
41 luaL_argcheck(L,a != NULL,1,"'array' expected.");
42 luaL_argcheck(L,0 <= index && index < a->size,2,"index out of range.");
43 if (lua_toboolean(L,3))
44 a->values[I_WORD(index)] |= I_BIT(index);
45 else
46 a->values[I_WORD(index)] &= ~I_BIT(index);
47 return 0;
48 }
49
50 extern "C" int getArray(lua_State* L)
51 {
52 NumArray* a = (NumArray*)luaL_checkudata(L,1,"myarray");
53 int index = luaL_checkint(L,2) - 1;
54 luaL_argcheck(L, a != NULL, 1, "'array' expected.");
55 luaL_argcheck(L, 0 <= index && index < a->size,2,"index out of range");
56 lua_pushboolean(L,a->values[I_WORD(index)] & I_BIT(index));
57 return 1;
58 }
59
60 extern "C" int getSize(lua_State* L)
61 {
62 NumArray* a = (NumArray*)luaL_checkudata(L,1,"myarray");
63 luaL_argcheck(L,a != NULL,1,"'array' expected.");
64 lua_pushinteger(L,a->size);
65 return 1;
66 }
67
68 extern "C" int array2string(lua_State* L)
69 {
70 NumArray* a = (NumArray*)luaL_checkudata(L,1,"myarray");
71 lua_pushfstring(L,"array(%d)",a->size);
72 return 1;
73 }
74
75 static luaL_Reg arraylib_f [] = {
76 {"new", newArray},
77 {NULL, NULL}
78 };
79
80 static luaL_Reg arraylib_m [] = {
81 {"set", setArray},
82 {"get", getArray},
83 {"size", getSize},
84 {"__tostring", array2string}, //print(a)鏃禠ua浼氳皟鐢ㄨ鍏冩柟娉曘?/span>
85 {NULL, NULL}
86 };
87
88 extern "C" __declspec(dllexport)
89 int luaopen_testuserdata(lua_State* L)
90 {
91 //1. 鍒涘緩鍏冭〃錛屽茍灝嗚鍏冭〃鎸囧畾緇檔ewArray鍑芥暟鏂板垱寤虹殑userdata銆傚湪Lua涓璾serdata涔熸槸浠able鐨勮韓浠借〃鐜扮殑銆?
92 //榪欐牱鍦ㄨ皟鐢ㄥ璞″嚱鏁版椂錛屽彲浠ラ氳繃楠岃瘉鍏秏etatable鐨勫悕縐版潵紜畾鍙傛暟userdata鏄惁鍚堟硶銆?/span>
93 luaL_newmetatable(L,"myarray");
94 lua_pushvalue(L,-1);
95 //2. 涓轟簡瀹炵幇闈㈠瀵硅薄鐨勮皟鐢ㄦ柟寮忥紝闇瑕佸皢鍏冭〃鐨刜_index瀛楁鎸囧悜鑷韓錛屽悓鏃跺啀灝哸rraylib_m鏁扮粍涓殑鍑芥暟娉ㄥ唽鍒?
96 //鍏冭〃涓紝涔嬪悗鍩轟簬榪欎簺娉ㄥ唽鍑芥暟鐨勮皟鐢ㄥ氨鍙互浠ラ潰鍚戝璞$殑褰㈠紡璋冪敤浜嗐?
97 //lua_setfield鍦ㄦ墽琛屽悗浼氬皢鏍堥《鐨則able寮瑰嚭銆?/span>
98 lua_setfield(L,-2,"__index");
99 //灝嗚繖浜涙垚鍛樺嚱鏁版敞鍐岀粰鍏冭〃錛屼互淇濊瘉Lua鍦ㄥ鎵炬柟娉曟椂鍙互瀹氫綅銆侼ULL鍙傛暟琛ㄧず灝嗙敤鏍堥《鐨則able浠f浛絎簩涓弬鏁般?/span>
100 luaL_register(L,NULL,arraylib_m);
101 //榪欓噷鍙敞鍐岀殑宸ュ巶鏂規硶銆?/span>
102 luaL_register(L,"testuserdata",arraylib_f);
103 return 1;
104 }
銆銆杞婚噺綰serdata錛?nbsp;
銆銆涔嬪墠浠嬬粛鐨勬槸full userdata錛孡ua榪樻彁渚涗簡鍙︿竴縐嶈交閲忕駭userdata(light userdata)銆備簨瀹炰笂錛岃交閲忕駭userdata浠呬粎琛ㄧず鐨勬槸C鎸囬拡鐨勫鹼紝鍗?void*)銆傜敱浜庡畠鍙槸涓涓鹼紝鎵浠ヤ笉鐢ㄥ垱寤恒傚鏋滈渶瑕佸皢涓涓交閲忕駭userdata鏀懼叆鏍堜腑錛岃皟鐢╨ua_pushlightuserdata鍗沖彲銆俧ull userdata鍜宭ight userdata涔嬮棿鏈澶х殑鍖哄埆鏉ヨ嚜浜庣浉絳夋у垽鏂紝瀵逛簬涓涓猣ull userdata錛屽畠鍙槸涓庤嚜韜浉絳夛紝鑰宭ight userdata鍒欒〃紺轟負涓涓狢鎸囬拡錛屽洜姝わ紝瀹冧笌鎵鏈夎〃紺哄悓涓鎸囬拡鐨刲ight userdata鐩哥瓑銆傚啀鏈夊氨鏄痩ight userdata涓嶄細鍙楀埌鍨冨溇鏀墮泦鍣ㄧ殑綆$悊錛屼嬌鐢ㄦ椂灝卞儚涓涓櫘閫氱殑鏁村瀷鏁板瓧涓鏍楓?/p>
1 #include <stdio.h>
2 #include <string.h>
3 #include <lua.hpp>
4 #include <lauxlib.h>
5 #include <lualib.h>
6
7 //寰匧ua璋冪敤鐨凜娉ㄥ唽鍑芥暟銆?/span>
8 static int add2(lua_State* L)
9 {
10 //媯鏌ユ爤涓殑鍙傛暟鏄惁鍚堟硶錛?琛ㄧずLua璋冪敤鏃剁殑絎竴涓弬鏁?浠庡乏鍒板彸)錛屼緷姝ょ被鎺ㄣ?
11 //濡傛灉Lua浠g爜鍦ㄨ皟鐢ㄦ椂浼犻掔殑鍙傛暟涓嶄負number錛岃鍑芥暟灝嗘姤閿欏茍緇堟紼嬪簭鐨勬墽琛屻?/span>
12 double op1 = luaL_checknumber(L,1);
13 double op2 = luaL_checknumber(L,2);
14 //灝嗗嚱鏁扮殑緇撴灉鍘嬪叆鏍堜腑銆傚鏋滄湁澶氫釜榪斿洖鍊鹼紝鍙互鍦ㄨ繖閲屽嬈″帇鍏ユ爤涓?/span>
15 lua_pushnumber(L,op1 + op2);
16 //榪斿洖鍊肩敤浜庢彁紺鴻C鍑芥暟鐨勮繑鍥炲兼暟閲忥紝鍗沖帇鍏ユ爤涓殑榪斿洖鍊兼暟閲忋?/span>
17 return 1;
18 }
19
20 //鍙︿竴涓緟Lua璋冪敤鐨凜娉ㄥ唽鍑芥暟銆?/span>
21 static int sub2(lua_State* L)
22 {
23 double op1 = luaL_checknumber(L,1);
24 double op2 = luaL_checknumber(L,2);
25 lua_pushnumber(L,op1 - op2);
26 return 1;
27 }
28
29 const char* testfunc = "print(add2(1.0,2.0)) print(sub2(20.1,19))";
30
31 int main()
32 {
33 lua_State* L = luaL_newstate();
34 luaL_openlibs(L);
35 //灝嗘寚瀹氱殑鍑芥暟娉ㄥ唽涓篖ua鐨勫叏灞鍑芥暟鍙橀噺錛屽叾涓涓涓瓧絎︿覆鍙傛暟涓篖ua浠g爜
36 //鍦ㄨ皟鐢–鍑芥暟鏃朵嬌鐢ㄧ殑鍏ㄥ眬鍑芥暟鍚嶏紝絎簩涓弬鏁頒負瀹為檯C鍑芥暟鐨勬寚閽堛?/span>
37 lua_register(L, "add2", add2);
38 lua_register(L, "sub2", sub2);
39 //鍦ㄦ敞鍐屽畬鎵鏈夌殑C鍑芥暟涔嬪悗錛屽嵆鍙湪Lua鐨勪唬鐮佸潡涓嬌鐢ㄨ繖浜涘凡緇忔敞鍐岀殑C鍑芥暟浜嗐?/span>
40 if (luaL_dostring(L,testfunc))
41 printf("Failed to invoke.\n");
42 lua_close(L); 43 return 0; 44 }
2. C鍑芥暟搴撴垚涓篖ua鐨勬ā鍧椼?/span>
灝嗗寘鍚獵鍑芥暟鐨勪唬鐮佺敓鎴愬簱鏂囦歡錛屽Linux鐨剆o錛屾垨Windows鐨凞LL錛屽悓鏃舵嫹璐濆埌Lua浠g爜鎵鍦ㄧ殑褰撳墠鐩綍錛屾垨鑰呮槸LUA_CPATH鐜鍙橀噺鎵鎸囧悜鐨勭洰褰曪紝浠ヤ究浜嶭ua瑙f瀽鍣ㄥ彲浠ユ紜畾浣嶅埌浠栦滑銆傚湪鎴戝綋鍓嶇殑Windows緋葷粺涓紝鎴戝皢鍏禼opy鍒?C:\Program Files\Lua\5.1\clibs\"錛岃繖閲屽寘鍚簡鎵鏈塋ua鍙皟鐢ㄧ殑C搴撱傝濡備笅C璇█浠g爜鍜屽叧閿ф敞閲婏細
1 #include <stdio.h>
2 #include <string.h>
3 #include <lua.hpp>
4 #include <lauxlib.h>
5 #include <lualib.h>
6
7 //寰呮敞鍐岀殑C鍑芥暟錛岃鍑芥暟鐨勫0鏄庡艦寮忓湪涓婇潰鐨勪緥瀛愪腑宸茬粡緇欏嚭銆?
8 //闇瑕佽鏄庣殑鏄紝璇ュ嚱鏁板繀欏諱互C鐨勫艦寮忚瀵煎嚭錛屽洜姝xtern "C"鏄繀欏葷殑銆?
9 //鍑芥暟浠g爜鍜屼笂渚嬬浉鍚岋紝榪欓噷涓嶅啀璧樿堪銆?/span>
10 extern "C" int add(lua_State* L)
11 { 12 double op1 = luaL_checknumber(L,1);
13 double op2 = luaL_checknumber(L,2);
14 lua_pushnumber(L,op1 + op2);
15 return 1;
16 }
17
18 extern "C" int sub(lua_State* L)
19 {
20 double op1 = luaL_checknumber(L,1);
21 double op2 = luaL_checknumber(L,2);
22 lua_pushnumber(L,op1 - op2);
23 return 1;
24 }
25
26 //luaL_Reg緇撴瀯浣撶殑絎竴涓瓧孌典負瀛楃涓詫紝鍦ㄦ敞鍐屾椂鐢ㄤ簬閫氱煡Lua璇ュ嚱鏁扮殑鍚嶅瓧銆?
27 //絎竴涓瓧孌典負C鍑芥暟鎸囬拡銆?
28 //緇撴瀯浣撴暟緇勪腑鐨勬渶鍚庝竴涓厓绱犵殑涓や釜瀛楁鍧囦負NULL錛岀敤浜庢彁紺篖ua娉ㄥ唽鍑芥暟宸茬粡鍒拌揪鏁扮粍鐨勬湯灝俱?/span>
29 static luaL_Reg mylibs[] = {
30 {"add", add},
31 {"sub", sub},
32 {NULL, NULL}
33 };
34
35 //璇搴撶殑鍞竴鍏ュ彛鍑芥暟銆傚叾鍑芥暟絳懼悕絳夊悓浜庝笂闈㈢殑娉ㄥ唽鍑芥暟銆傝濡備笅鍑犵偣璇存槑錛?
36 //1. 鎴戜滑鍙互灝嗚鍑芥暟綆鍗曠殑鐞嗚В涓烘ā鍧楃殑宸ュ巶鍑芥暟銆?
37 //2. 鍏跺嚱鏁板悕蹇呴』涓簂uaopen_xxx錛屽叾涓瓁xx琛ㄧずlibrary鍚嶇О銆侺ua浠g爜require "xxx"闇瑕佷笌涔嬪搴斻?
38 //3. 鍦╨uaL_register鐨勮皟鐢ㄤ腑錛屽叾絎竴涓瓧絎︿覆鍙傛暟涓烘ā鍧楀悕"xxx"錛岀浜屼釜鍙傛暟涓哄緟娉ㄥ唽鍑芥暟鐨勬暟緇勩?
39 //4. 闇瑕佸己璋冪殑鏄紝鎵鏈夐渶瑕佺敤鍒?xxx"鐨勪唬鐮侊紝涓嶈C榪樻槸Lua錛岄兘蹇呴』淇濇寔涓鑷達紝榪欐槸Lua鐨勭害瀹氾紝
40 // 鍚﹀垯灝嗘棤娉曡皟鐢ㄣ?/span>
41 extern "C" __declspec(dllexport)
42 int luaopen_mytestlib(lua_State* L)
43 {
44 const char* libName = "mytestlib";
45 luaL_register(L,libName,mylibs);
46 return 1;
47 }
瑙佸涓婰ua浠g爜錛?/p>
1 require "mytestlib" --鎸囧畾鍖呭悕縐?/span>
2
3 --鍦ㄨ皟鐢ㄦ椂錛屽繀欏繪槸package.function
4 print(mytestlib.add(1.0,2.0))
5 print(mytestlib.sub(20.1,19))
1 #include <stdio.h>
2 #include <string.h>
3 #include <lua.hpp>
4 #include <lauxlib.h>
5 #include <lualib.h>
6
7 int main(void)
8 {
9 const char* buff = "print(\"hello\")";
10 int error;
11 lua_State* L = luaL_newstate();
12 luaL_openlibs(L);
13
14 error = luaL_loadbuffer(L,buff,strlen(buff),"line") || lua_pcall(L,0,0,0);
15 int s = lua_gettop(L);
16 if (error) {
17 fprintf(stderr,"%s",lua_tostring(L,-1));
18 lua_pop(L,1);
19 }
20 lua_close(L);
21 return 0;
22 }
涓嬮潰鏄拡瀵逛互涓婁唬鐮佺粰鍑虹殑鍏蜂綋瑙i噴錛?br /> 1). 涓婇潰鐨勪唬鐮佹槸鍩轟簬鎴戠殑C++宸ョ▼錛岃岄潪C宸ョ▼錛屽洜姝ゅ寘鍚殑澶存枃浠舵槸lua.hpp錛屽鏋滄槸C宸ョ▼錛屽彲浠ョ洿鎺ュ寘鍚玪ua.h銆?br /> 2). Lua搴撲腑娌℃湁瀹氫箟浠諱綍鍏ㄥ眬鍙橀噺錛岃屾槸灝嗘墍鏈夌殑鐘舵侀兘淇濆瓨鍦ㄥ姩鎬佺粨鏋刲ua_State涓紝鍚庨潰鎵鏈夌殑C API閮介渶瑕佽鎸囬拡浣滀負絎竴涓弬鏁般?br /> 3). luaL_openlibs鍑芥暟鏄敤浜庢墦寮Lua涓殑鎵鏈夋爣鍑嗗簱錛屽io搴撱乻tring搴撶瓑銆?br /> 4). luaL_loadbuffer緙栬瘧浜哹uff涓殑Lua浠g爜錛屽鏋滄病鏈夐敊璇紝鍒欒繑鍥?錛屽悓鏃跺皢緙栬瘧鍚庣殑紼嬪簭鍧楀帇鍏ヨ櫄鎷熸爤涓?br /> 5). lua_pcall鍑芥暟浼氬皢紼嬪簭鍧椾粠鏍堜腑寮瑰嚭錛屽茍鍦ㄤ繚鎶ゆā寮忎笅榪愯璇ョ▼搴忓潡銆傛墽琛屾垚鍔熻繑鍥?錛屽惁鍒欏皢閿欒淇℃伅鍘嬪叆鏍堜腑銆?br /> 6). lua_tostring鍑芥暟涓殑-1錛岃〃紺烘爤欏剁殑绱㈠紩鍊鹼紝鏍堝簳鐨勭儲寮曞間負1錛屼互姝ょ被鎺ㄣ傝鍑芥暟灝嗚繑鍥炴爤欏剁殑閿欒淇℃伅錛屼絾鏄笉浼氬皢鍏朵粠鏍堜腑寮瑰嚭銆?br /> 7). lua_pop鏄竴涓畯錛岀敤浜庝粠铏氭嫙鏍堜腑寮瑰嚭鎸囧畾鏁伴噺鐨勫厓绱狅紝榪欓噷鐨?琛ㄧず浠呭脊鍑烘爤欏剁殑鍏冪礌銆?br /> 8). lua_close鐢ㄤ簬閲婃斁鐘舵佹寚閽堟墍寮曠敤鐨勮祫婧愩?br /> 3). 鍏跺畠鏍堟搷浣滃嚱鏁幫細
2. 鏍堬細
鍦↙ua鍜孋璇█涔嬮棿榪涜鏁版嵁浜ゆ崲鏃訛紝鐢變簬涓ょ璇█涔嬮棿鏈夌潃杈冨ぇ鐨勫樊寮傦紝姣斿Lua鏄姩鎬佺被鍨嬶紝C璇█鏄潤鎬佺被鍨嬶紝Lua鏄嚜鍔ㄥ唴瀛樼鐞嗭紝鑰孋璇█鍒欐槸鎵嬪姩鍐呭瓨綆$悊銆備負浜嗚В鍐寵繖浜涢棶棰橈紝Lua鐨勮璁¤呬嬌鐢ㄤ簡铏氭嫙鏍堜綔涓轟簩鑰呬箣闂存暟鎹氦浜掔殑浠嬭川銆傚湪C/C++紼嬪簭涓紝濡傛灉瑕佽幏鍙朙ua鐨勫鹼紝鍙渶璋冪敤Lua鐨凜 API鍑芥暟錛孡ua灝變細灝嗘寚瀹氱殑鍊煎帇鍏ユ爤涓傝灝嗕竴涓間紶緇橪ua鏃訛紝闇瑕佸厛灝嗚鍊煎帇鍏ユ爤錛岀劧鍚庤皟鐢↙ua鐨凜 API錛孡ua灝變細鑾峰彇璇ュ煎茍灝嗗叾浠庢爤涓脊鍑恒備負浜嗗彲浠ュ皢涓嶅悓綾誨瀷鐨勫煎帇鍏ユ爤錛屼互鍙婁粠鏍堜腑鍙栧嚭涓嶅悓綾誨瀷鐨勫鹼紝Lua涓烘瘡縐嶇被鍨嬪潎璁懼畾浜嗕竴涓壒瀹氬嚱鏁般?br /> 1). 鍘嬪叆鍏冪礌錛?br /> Lua閽堝姣忕C綾誨瀷錛岄兘鏈変竴涓狢 API鍑芥暟涓庝箣瀵瑰簲錛屽錛?br /> void lua_pushnil(lua_State* L); --nil鍊?/span>
void lua_pushboolean(lua_State* L, int b); --甯冨皵鍊?/span>
void lua_pushnumber(lua_State* L, lua_Number n); --嫻偣鏁?/span>
void lua_pushinteger(lua_State* L, lua_Integer n); --鏁村瀷
void lua_pushlstring(lua_State* L, const char* s, size_t len); --鎸囧畾闀垮害鐨勫唴瀛樻暟鎹?/span>
void lua_pushstring(lua_State* L, const char* s); --浠ラ浂緇撳熬鐨勫瓧絎︿覆錛屽叾闀垮害鍙敱strlen寰楀嚭銆?/span>
瀵逛簬瀛楃涓叉暟鎹紝Lua涓嶄細鎸佹湁浠栦滑鐨勬寚閽堬紝鑰屾槸璋冪敤鍦ˋPI鏃剁敓鎴愪竴涓唴閮ㄥ壇鏈紝鍥犳錛屽嵆浣垮湪榪欎簺鍑芥暟榪斿洖鍚庣珛鍒婚噴鏀炬垨淇敼榪欎簺瀛楃涓叉寚閽堬紝涔熶笉浼氭湁浠諱綍闂銆?br /> 鍦ㄥ悜鏍堜腑鍘嬪叆鏁版嵁鏃訛紝鍙互閫氳繃璋冪敤涓嬮潰鐨勫嚱鏁板垽鏂槸鍚︽湁瓚沖鐨勬爤絀洪棿鍙敤錛屼竴鑸岃█錛孡ua浼氶鐣?0涓Ы浣嶏紝瀵逛簬鏅氬簲鐢ㄦ潵璇村凡緇忚凍澶熶簡錛岄櫎闈炴槸閬囧埌鏈夊緢澶氬弬鏁扮殑鍑芥暟銆?br /> int lua_checkstack(lua_State* L, int extra) --鏈熸湜寰楀埌extra鏁伴噺鐨勭┖闂叉Ы浣嶏紝濡傛灉涓嶈兘鎵╁睍騫惰幏寰楋紝榪斿洖false銆?/span>
2). 鏌ヨ鍏冪礌錛?br /> API浣跨敤“绱㈠紩”鏉ュ紩鐢ㄦ爤涓殑鍏冪礌錛岀涓涓帇鍏ユ爤鐨勪負1錛岀浜屼釜涓?錛屼緷姝ょ被鎺ㄣ傛垜浠篃鍙互浣跨敤璐熸暟浣滀負绱㈠紩鍊鹼紝鍏朵腑-1琛ㄧず涓烘爤欏跺厓绱狅紝-2涓烘爤欏朵笅闈㈢殑鍏冪礌錛屽悓鏍蜂緷姝ょ被鎺ㄣ?br /> Lua鎻愪緵浜嗕竴緇勭壒瀹氱殑鍑芥暟鐢ㄤ簬媯鏌ヨ繑鍥炲厓绱犵殑綾誨瀷錛屽錛?br /> int lua_isboolean (lua_State *L, int index);
int lua_iscfunction (lua_State *L, int index);
int lua_isfunction (lua_State *L, int index);
int lua_isnil (lua_State *L, int index);
int lua_islightuserdata (lua_State *L, int index);
int lua_isnumber (lua_State *L, int index);
int lua_isstring (lua_State *L, int index);
int lua_istable (lua_State *L, int index);
int lua_isuserdata (lua_State *L, int index);
浠ヤ笂鍑芥暟錛屾垚鍔熻繑鍥?錛屽惁鍒欒繑鍥?銆傞渶瑕佺壒鍒寚鍑虹殑鏄紝瀵逛簬lua_isnumber鑰岃█錛屼笉浼氭鏌ュ兼槸鍚︿負鏁板瓧綾誨瀷錛岃屾槸媯鏌ュ兼槸鍚﹁兘杞崲涓烘暟瀛楃被鍨嬨?br /> Lua榪樻彁渚涗簡涓涓嚱鏁發ua_type錛岀敤浜庤幏鍙栧厓绱犵殑綾誨瀷錛屽嚱鏁板師鍨嬪涓嬶細
int lua_type (lua_State *L, int index);
璇ュ嚱鏁扮殑榪斿洖鍊間負涓緇勫父閲忓鹼紝鍒嗗埆鏄細LUA_TNIL銆丩UA_TNUMBER銆丩UA_TBOOLEAN銆丩UA_TSTRING銆丩UA_TTABLE銆丩UA_TFUNCTION銆丩UA_TUSERDATA銆丩UA_TTHREAD鍜孡UA_TLIGHTUSERDATA銆傝繖浜涘父閲忛氬父鐢ㄤ簬switch璇彞涓?br /> 闄や簡涓婅堪鍑芥暟涔嬪錛孡ua榪樻彁渚涗簡涓緇勮漿鎹㈠嚱鏁幫紝濡傦細
int lua_toboolean (lua_State *L, int index);
lua_CFunction lua_tocfunction (lua_State *L, int index);
lua_Integer lua_tointeger (lua_State *L, int index);
const char *lua_tolstring (lua_State *L, int index, size_t *len);
lua_Number lua_tonumber (lua_State *L, int index);
const void *lua_topointer (lua_State *L, int index);
const char *lua_tostring (lua_State *L, int index);
void *lua_touserdata (lua_State *L, int index);
--string綾誨瀷榪斿洖瀛楃涓查暱搴︼紝table綾誨瀷榪斿洖鎿嶄綔絎?#'絳夊悓鐨勭粨鏋滐紝userdata綾誨瀷榪斿洖鍒嗛厤鐨勫唴瀛樺潡闀垮害銆?/span>
size_t lua_objlen (lua_State *L, int index);銆
瀵逛簬涓婅堪鍑芥暟錛屽鏋滆皟鐢ㄥけ璐ワ紝lua_toboolean銆乴ua_tonumber銆乴ua_tointeger鍜宭ua_objlen鍧囪繑鍥?錛岃屽叾浠栧嚱鏁板垯榪斿洖NULL銆傚湪寰堝鏃跺?涓嶆槸涓涓緢鏈夋晥鐨勭敤浜庡垽鏂敊璇殑鍊鹼紝浣嗘槸ANSI C娌℃湁鎻愪緵鍏朵粬鍙互琛ㄧず閿欒鐨勫箋傚洜姝ゅ浜庤繖浜涘嚱鏁幫紝鍦ㄦ湁浜涙儏鍐典笅闇瑕佸厛浣跨敤lua_is*緋誨垪鍑芥暟鍒ゆ柇鏄惁綾誨瀷姝g‘錛岃屽浜庡墿涓嬬殑鍑芥暟錛屽垯鍙互鐩存帴閫氳繃鍒ゆ柇榪斿洖鍊兼槸鍚︿負NULL鍗沖彲銆?br /> 瀵逛簬lua_tolstring鍑芥暟榪斿洖鐨勬寚鍚戝唴閮ㄥ瓧絎︿覆鐨勬寚閽堬紝鍦ㄨ绱㈠紩鎸囧悜鐨勫厓绱犺寮瑰嚭涔嬪悗錛屽皢鏃犳硶淇濊瘉浠嶇劧鏈夋晥銆傝鍑芥暟榪斿洖鐨勫瓧絎︿覆鏈熬鍧囦細鏈変竴涓熬閮?銆?br /> 涓嬮潰灝嗙粰鍑轟竴涓伐鍏峰嚱鏁幫紝鍙敤浜庢紨紺轟笂闈㈡彁鍒扮殑閮ㄥ垎鍑芥暟錛屽錛?/p> 1 static void stackDump(lua_State* L)
2 {
3 int top = lua_gettop(L);
4 for (int i = 1; i <= top; ++i) {
5 int t = lua_type(L,i);
6 switch(t) {
7 case LUA_TSTRING:
8 printf("'%s'",lua_tostring(L,i));
9 break;
10 case LUA_TBOOLEAN:
11 printf(lua_toboolean(L,i) ? "true" : "false");
12 break;
13 case LUA_TNUMBER:
14 printf("%g",lua_tonumber(L,i));
15 break;
16 default:
17 printf("%s",lua_typename(L,t));
18 break;
19 }
20 printf("");
21 }
22 printf("\n");
23 }
闄や簡涓婇潰緇欏嚭鐨勬暟鎹氦鎹㈠嚱鏁頒箣澶栵紝Lua鐨凜 API榪樻彁渚涗簡涓緇勭敤浜庢搷浣滆櫄鎷熸爤鐨勬櫘閫氬嚱鏁幫紝濡傦細
int lua_gettop(lua_State* L); --榪斿洖鏍堜腑鍏冪礌鐨勪釜鏁般?/span>
void lua_settop(lua_State* L, int index); --灝嗘爤欏惰緗負鎸囧畾鐨勭儲寮曞箋?/span>
void lua_pushvalue(lua_State* L, int index); --灝嗘寚瀹氱儲寮曠殑鍏冪礌鍓湰鍘嬪叆鏍堛?/span>
void lua_remove(lua_State* L, int index); --鍒犻櫎鎸囧畾绱㈠紩涓婄殑鍏冪礌錛屽叾涓婇潰鐨勫厓绱犺嚜鍔ㄤ笅縐匯?/span>
void lua_insert(lua_State* L, int index); --灝嗘爤欏跺厓绱犳彃鍏ュ埌璇ョ儲寮曞兼寚鍚戠殑浣嶇疆銆?/span>
void lua_replace(lua_State* L, int index); --寮瑰嚭鏍堥《鍏冪礌錛屽茍灝嗚鍊艱緗埌鎸囧畾绱㈠紩涓娿?/span>
Lua榪樻彁渚涗簡涓涓畯鐢ㄤ簬寮瑰嚭鎸囧畾鏁伴噺鐨勫厓绱狅細#define lua_pop(L,n) lua_settop(L, -(n) - 1)
瑙佸涓嬬ず渚嬩唬鐮侊細 1 int main()
2 {
3 lua_State* L = luaL_newstate();
4 lua_pushboolean(L,1);
5 lua_pushnumber(L,10);
6 lua_pushnil(L);
7 lua_pushstring(L,"hello");
8 stackDump(L); //true 10 nil 'hello'
9
10 lua_pushvalue(L,-4);
11 stackDump(L); //true 10 nil 'hello' true
12
13 lua_replace(L,3);
14 stackDump(L); //true 10 true 'hello'
15
16 lua_settop(L,6);
17 stackDump(L); //true 10 true 'hello' nil nil
18
19 lua_remove(L,-3);
20 stackDump(L); //true 10 true nil nil
21
22 lua_settop(L,-5);
23 stackDump(L); //true
24
25 lua_close(L);
26 return 0;
27 }
3. C API涓殑閿欒澶勭悊錛?/span>
1). C紼嬪簭璋冪敤Lua浠g爜鐨勯敊璇鐞嗭細
閫氬父鎯呭喌涓嬶紝搴旂敤紼嬪簭浠g爜鏄互“鏃犱繚鎶?#8221;妯″紡榪愯鐨勩傚洜姝わ紝褰揕ua鍙戠幇“鍐呭瓨涓嶈凍”榪欑被閿欒鏃訛紝鍙兘閫氳繃璋冪敤“绱ф?#8221;鍑芥暟鏉ラ氱煡C璇█紼嬪簭錛屼箣鍚庡湪緇撴潫搴旂敤紼嬪簭銆傜敤鎴峰彲閫氳繃lua_atpanic鏉ヨ緗嚜宸辯殑“绱ф?#8221;鍑芥暟銆傚鏋滃笇鏈涘簲鐢ㄧ▼搴忎唬鐮佸湪鍙戠敓Lua閿欒鏃朵笉浼氶鍑猴紝鍙氳繃璋冪敤lua_pcall鍑芥暟浠ヤ繚鎶ゆā寮忚繍琛孡ua浠g爜銆傝繖鏍峰啀鍙戠敓鍐呭瓨閿欒鏃訛紝lua_pcall浼氳繑鍥炰竴涓敊璇唬鐮侊紝騫跺皢瑙i噴鍣ㄩ噸緗負涓鑷寸殑鐘舵併傚鏋滆淇濇姢涓嶭ua鐨凜浠g爜錛屽彲浠ヤ嬌鐢?span style="color: #0000ff;">lua_cpall鍑芥暟錛屽畠灝嗘帴鍙椾竴涓狢鍑芥暟浣滀負鍙傛暟錛岀劧鍚庤皟鐢ㄨ繖涓狢鍑芥暟銆?br />
2). Lua璋冪敤C紼嬪簭錛?br /> 閫氬父鑰岃█錛屽綋涓涓Lua璋冪敤鐨凜鍑芥暟媯嫻嬪埌閿欒鏃訛紝瀹冨氨搴旇璋冪敤lua_error錛岃鍑芥暟浼氭竻鐞哃ua涓墍鏈夐渶瑕佹竻鐞嗙殑璧勬簮錛岀劧鍚庤煩杞洖鍙戣搗鎵ц鐨勯偅涓猯ua_pcall錛屽茍闄勪笂涓鏉¢敊璇俊鎭?/p>
| 鍙傛暟瀛楃涓?/span> | 鍚箟 |
| "*all" | 璇誨彇鏁翠釜鏂囦歡 |
| "*line" | 璇誨彇涓嬩竴琛?/span> |
| "*number" | 璇誨彇涓涓暟瀛?/span> |
| <num> | 璇誨彇涓涓笉瓚呰繃<num>涓瓧絎︾殑瀛楃涓?/span> |
璋冪敤io.read("*all")浼氳鍙栧綋鍓嶈緭鍏ユ枃浠剁殑鎵鏈夊唴瀹癸紝浠ュ綋鍓嶄綅緗綔涓哄紑濮嬨傚鏋滃綋鍓嶄綅緗浜庢枃浠剁殑鏈熬錛屾垨鑰呮枃浠朵負絀猴紝閭d釜璇ヨ皟鐢ㄨ繑鍥炰竴涓┖瀛楃涓層傜敱浜嶭ua鍙互楂樻晥鐨勫鐞嗛暱瀛楃涓詫紝鍥犳鍦↙ua涓彲浠ュ厛灝嗘暟鎹粠鏂囦歡涓畬鏁磋鍑猴紝涔嬪悗鍦ㄩ氳繃Lua瀛楃涓插簱鎻愪緵鐨勫嚱鏁拌繘琛屽悇縐嶅鐞嗐?br /> 璋冪敤io.read("*line")浼氳繑鍥炲綋鍓嶆枃浠剁殑涓嬩竴琛岋紝浣嗕笉鍖呭惈鎹㈣絎︺傚綋鍒拌揪鏂囦歡鏈熬鏃訛紝璇ヨ皟鐢ㄨ繑鍥瀗il銆傚錛?/p>
1 for count = 1,math.huge do
2 local line = io.read("*line") --濡傛灉涓嶄紶鍙傛暟錛岀己鐪佸間篃鏄?*line"
3 if line == nil then
4 break
5 end
6 io.write(string.format("%6d ",count),line,"\n")
7 end
濡傛灉鍙槸涓轟簡榪唬鏂囦歡涓殑鎵鏈夎錛屽彲浠ヤ嬌鐢?span style="color: #0000ff;">io.lines鍑芥暟錛屼互榪唬鍣ㄧ殑褰㈠紡璁塊棶鏂囦歡涓殑姣忎竴琛屾暟鎹紝濡傦細
1 local lines = {}
2 for line in io.lines() do --閫氳繃榪唬鍣ㄨ闂瘡涓涓暟鎹?/span>
3 lines[#lines + 1] = line
4 end
5 table.sort(lines) --鎺掑簭錛孡ua鏍囧噯搴撶殑table搴撴彁渚涚殑鍑芥暟銆?/span>
6 for _,l in ipairs(lines) do
7 io.write(l,"\n")
8 end
璋冪敤io.read("*number")浼氫粠褰撳墠杈撳叆鏂囦歡涓鍙栦竴涓暟瀛椼傛鏃秗ead灝嗙洿鎺ヨ繑鍥炰竴涓暟瀛楋紝鑰屼笉鏄瓧絎︿覆銆?*number"閫夐」浼氬拷鐣ユ暟瀛楀墠闈㈡墍鏈夌殑絀烘牸錛屽茍涓旇兘澶勭悊鍍?3銆?5.2榪欐牱鐨勬暟瀛楁牸寮忋傚鏋滃綋鍓嶈鍙栫殑鏁版嵁涓嶆槸鍚堟硶鐨勬暟瀛楋紝read榪斿洖nil銆傚湪璋冪敤read鏄彲浠ユ寚瀹氬涓夐」錛屽嚱鏁頒細鏍規嵁姣忎釜閫夐」鍙傛暟榪斿洖鐩稿簲鐨勫唴瀹廣傚錛?/p>
1 --[[
2 6.0 -3.23 1000
3 ... ...
4 涓嬮潰鐨勪唬鐮佽鍙栨敞閲婁腑鐨勬暟瀛?br /> 5 --]]
6 while true do
7 local n1,n2,n3 = io.read("*number","*number","*number")
8 if not n1 then
9 break
10 end
11 print(math.max(n1,n2,n3))
12 end
璋冪敤io.read(<num>)浼氫粠杈撳叆鏂囦歡涓渶澶氳鍙杗涓瓧絎︼紝濡傛灉璇諱笉鍒頒換浣曞瓧絎︼紝榪斿洖nil銆傚惁鍒欒繑鍥炶鍙栧埌鐨勫瓧絎︿覆銆傚錛?/p>
io.read(0)鏄竴縐嶇壒孌婄殑鎯呭喌錛岀敤浜庢鏌ユ槸鍚﹀埌杈句簡鏂囦歡鐨勬湯灝俱傚鏋滄病鏈夊埌杈撅紝榪斿洖絀哄瓧絎︿覆錛屽惁鍒檔il銆?br />
2. 瀹屾暣I/O妯″瀷錛?/span>
Lua涓畬鏁碔/O妯″瀷鐨勪嬌鐢ㄦ柟寮忛潪甯哥被浼間簬C榪愯鏃跺簱鐨勬枃浠舵搷浣滃嚱鏁幫紝瀹冧滑閮芥槸鍩轟簬鏂囦歡鍙ユ焺鐨勩?br /> 1). 閫氳繃io.open鍑芥暟鎵撳紑鎸囧畾鐨勬枃浠訛紝騫朵笖鍦ㄥ弬鏁頒腑緇欏嚭瀵硅鏂囦歡鐨勬墦寮妯″紡錛屽叾涓?span style="color: #0000ff;">"r"琛ㄧず璇誨彇錛?span style="color: #0000ff;">"w"琛ㄧず瑕嗙洊鍐欏叆錛屽嵆鍏堝垹闄ゆ枃浠跺師鏈夌殑鍐呭錛?span style="color: #0000ff;">"a"琛ㄧず榪藉姞寮忓啓鍏ワ紝"b"琛ㄧず浠ヤ簩榪涘埗鐨勬柟寮忔墦寮鏂囦歡銆傚湪鎴愬姛鎵撳紑鏂囦歡鍚庯紝璇ュ嚱鏁板皢榪斿洖琛ㄧず璇ユ枃浠剁殑鍙ユ焺錛屽悗闈㈡墍鏈夊熀浜庤鏂囦歡鐨勬搷浣滐紝閮介渶瑕佸皢璇ュ彞鏌勪綔涓哄弬鏁頒紶鍏ャ傚鏋滄墦寮澶辮觸錛岃繑鍥瀗il銆傚叾涓敊璇俊鎭敱璇ュ嚱鏁扮殑絎簩涓弬鏁拌繑鍥烇紝濡傦細
assert(io.open(filename,mode)) --濡傛灉鎵撳紑澶辮觸錛宎ssert灝嗘墦鍗扮浜屼釜鍙傛暟緇欏嚭鐨勯敊璇俊鎭?/span>
2). 鏂囦歡璇誨啓鍑芥暟read/write銆傝繖閲岄渶瑕佺敤鍒板啋鍙瘋娉曪紝濡傦細
1 local f = assert(io.open(filename,"r"))
2 local t = f:read("*all") --瀵逛簬read鑰岃█錛屽叾鍙傛暟瀹屽叏絳夊悓浜庣畝鍗曟ā鍨嬩笅read鐨勫弬鏁般?/span>
3 f:close()
姝ゅ錛孖/O搴撹繕鎻愪緵浜?涓瀹氫箟鐨勬枃浠跺彞鏌勶紝鍗?span style="color: #0000ff;">io.stdin(鏍囧噯杈撳叆)銆乮o.stdout(鏍囧噯杈撳嚭)銆乮o.stderr(鏍囧噯閿欒杈撳嚭)銆傚錛?br /> io.stderr:write("This is an error message.")
浜嬪疄涓婏紝鎴戜滑涔熷彲浠ユ販鍚堜嬌鐢ㄧ畝鍗曟ā寮忓拰瀹屾暣妯″紡錛屽錛?/p>
1 local temp = io.input() --灝嗗綋鍓嶆枃浠跺彞鏌勪繚瀛?/span>
2 io.input("newInputfile") --鎵撳紑鏂扮殑杈撳叆鏂囦歡
3 io.input():close() --鍏抽棴褰撳墠鏂囦歡
4 io.input(temp) --鎭㈠鍘熸潵鐨勮緭鍏ユ枃浠?/span>
3). 鎬ц兘灝忔妧宸э細
鐢變簬涓嬈℃ц鍙栨暣涓枃浠舵瘮閫愯璇誨彇瑕佸揩涓浜涳紝浣嗗浜庤緝澶х殑鏂囦歡錛岃繖鏍峰茍涓嶅彲琛岋紝鍥犳Lua鎻愪緵浜嗕竴縐嶆姌涓殑鏂瑰紡錛屽嵆涓嬈¤鍙栨寚瀹氬瓧鑺傛暟閲忕殑鏁版嵁錛屽鏋滃綋鍓嶈鍙栦腑鐨勬渶鍚庝竴琛屼笉鏄畬鏁寸殑涓琛岋紝鍙氳繃璇ユ柟寮忓皢璇ヨ鐨勫墿浣欓儴鍒嗕篃涓騫惰鍏ワ紝浠庤屼繚璇佹湰嬈¤鍙栫殑鏁版嵁鍧囦負鏁磋鏁版嵁錛屼互渚夸簬涓婂眰閫昏緫鐨勫鐞嗐傚錛?br /> local lines,rest = f:read(BUFSIZE,"*line") --rest鍙橀噺鍖呭惈鏈鍚庝竴琛屼腑娌℃湁璇誨彇鐨勯儴鍒嗐?/span>
涓嬮潰鏄疭hell涓瓀c鍛戒護鐨勪竴涓畝鍗曞疄鐜般?/p> 1 local BUFSIZE = 8192
2 local f = io.input(arg[1]) --鎵撳紑杈撳叆鏂囦歡
3 local cc, lc, wc, = 0, 0, 0 --鍒嗗埆璁℃暟瀛楃銆佽鍜屽崟璇?
4 while true do
5 local lines,rest = f:read(BUFSIZE,"*line")
6 if not lines then
7 break
8 end
9 if rest then
10 lines = lines .. rest .. "\n"
11 end
12 cc = cc + #lines
13 --璁$畻鍗曡瘝鏁伴噺
14 local _, t = string.gsub(lines."%S+","")
15 wc = wc + t
16 --璁$畻琛屾暟
17 _,t = string.gsub(line,"\n","\n")
18 lc = lc + t
19 end
20 print(lc,wc,cc)
4). 鍏跺畠鏂囦歡鎿嶄綔錛?br /> 濡?span style="color: #0000ff;">io.flush
1 function fsize(file)
2 local current = file:seek() --鑾峰彇褰撳墠浣嶇疆
3 local size = file:seek("end") --鑾峰彇鏂囦歡澶у皬
4 file:seek("set",current) --鎭㈠鍘熸湁鐨勫綋鍓嶄綅緗?/span>
5 return size
6 end
鏈鍚庨渶瑕佹寚鍑虹殑鏄紝濡傛灉鍙戠敓閿欒錛屾墍鏈夎繖浜涘嚱鏁板潎榪斿洖nil鍜屼竴鏉¢敊璇俊鎭?/p>
| 瀛楁鍚?/span> | 鎻忚堪 |
| year | 涓涓畬鏁寸殑騫翠喚 |
| month | 01-12 |
| day | 01-31 |
| hour | 00-23 |
| min | 00-59 |
| sec | 00-59 |
| isdst | 甯冨皵鍊鹼紝true琛ㄧず澶忎護鏃?/span> |
print(os.time{year = 1970, month = 1, day = 1, hour = 8, min = 0}) --鍖椾含鏄笢鍏尯錛屾墍浠our絳変簬鏃惰〃紺篣TC鐨?銆?/span> date鍑芥暟鐨勬牸寮忓寲鏍囪瘑鍜孋榪愯鏃跺簱涓殑strftime鍑芥暟鐨勬爣璇嗗畬鍏ㄧ浉鍚岋紝瑙佷笅琛細 print(os.date("%Y-%m-%d")) --杈撳嚭2012-04-05
print(os.time()) --杈撳嚭褰撳墠鏃墮棿璺濈1970-1-1 00:00:00鎵緇忚繃鐨勭鏁般傝緭鍑哄間負 1333594721
鍑芥暟date鏄痶ime鐨勫弽鍑芥暟錛屽嵆鍙互灝唗ime榪斿洖鐨勬暟瀛楀艱漿鎹負鏇撮珮綰х殑鍙鏍煎紡錛屽叾絎竴涓弬鏁版槸鏍煎紡鍖栧瓧絎︿覆錛岃〃紺烘湡鏈涚殑鏃ユ湡榪斿洖鏍煎紡錛岀浜屼釜鍙傛暟鏄棩鏈熷拰鏃墮棿鐨勬暟瀛楋紝緙虹渷涓哄綋鍓嶆棩鏈熷拰鏃墮棿銆傚錛?/p> 1 dd = os.date("*t",os.time()) --濡傛灉鏍煎紡鍖栧瓧絎︿覆涓?*t"錛屽嚱鏁板皢榪斿洖table褰㈠紡鐨勬棩鏈熷璞°?/span>濡傛灉涓?!*t"錛屽垯琛ㄧず涓篣TC鏃墮棿鏍煎紡銆?br /> 2 print("year = " .. dd.year)
3 print("month = " .. dd.month)
4 print("day = " .. dd.day)
5 print("weekday = " .. dd.wday) --涓涓槦鏈熶腑鐨勭鍑犲ぉ錛屽懆鏃ユ槸絎竴澶?/span>
6 print("yearday = " .. dd.yday) --涓騫翠腑鐨勭鍑犲ぉ錛?鏈?鏃ユ槸絎竴澶?/span>
7 print("hour = " .. dd.hour)
8 print("min = " .. dd.min)
9 print("sec = " .. dd.sec)
10
11 --[[
12 year = 2012
13 month = 4
14 day = 5
15 weekday = 5
16 yearday = 96
17 hour = 11
18 min = 13
19 sec = 44
20 --]]鍏抽敭瀛?/span> 鎻忚堪 %a 涓鏄熸湡涓ぉ鏁扮殑緙╁啓錛屽Wed %A 涓鏄熸湡涓ぉ鏁扮殑鍏ㄧО錛屽Friday %b 鏈堜喚鐨勭緝鍐欙紝濡係ep %B 鏈堜喚鐨勫叏縐幫紝濡係eptember %c 鏃ユ湡鍜屾椂闂?/span> %d 涓涓湀涓殑絎嚑澶?01-31) %H 24灝忔椂鍒朵腑鐨勫皬鏃舵暟(00-23) %I 12灝忔椂鍒朵腑鐨勫皬鏃舵暟(01-12) %j 涓騫翠腑鐨勭鍑犲ぉ(001-366) %M 鍒嗛挓(00-59) %m 鏈堜喚(01-12) %p "涓婂崍(am)"鎴?涓嬪崍(pm)" %S 縐掓暟(00-59) %w 涓鏄熸湡涓殑絎嚑澶?0--6絳変環浜庢槦鏈熸棩--鏄熸湡鍏? %x 鏃ユ湡錛屽09/16/2010 %X 鏃墮棿錛屽23:48:20 %y 涓や綅鏁扮殑騫翠喚(00-99) %Y 瀹屾暣鐨勫勾浠?2012) %% 瀛楃'%'
鍑芥暟os.clock()榪斿洖CPU鏃墮棿鐨勬弿榪幫紝閫氬父鐢ㄤ簬璁$畻涓孌典唬鐮佺殑鎵ц鏁堢巼銆傚錛?/p>1 local x = os.clock()
2 local s = 0
3 for i = 1, 10000000 do
4 s = s + i
5 end
6 print(string.format("elapsed time: %.2f\n", os.clock() - x))
7
8 --杈撳嚭緇撴灉涓猴細
9 --elapsed time: 0.21
2. 鍏朵粬緋葷粺璋冪敤錛?/span>
鍑芥暟os.exit()鍙腑姝㈠綋鍓嶇▼搴忕殑鎵ц銆傚嚱鏁?span style="color: #0000ff;">os.getenv()鍙幏鍙栦竴涓幆澧冨彉閲忕殑鍊箋傚錛?br /> print(os.getenv("PATH")) --濡傛灉鐜鍙橀噺涓嶅瓨鍦紝榪斿洖nil銆?/span>
os.execute鍑芥暟鐢ㄤ簬鎵ц鍜屾搷浣滅郴緇熺浉鍏崇殑鍛戒護錛屽錛?br /> os.execute("mkdir " .. "hello")
]]>