• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            colorful

            zc qq:1337220912

             

            cocos2dx使用了第三方庫照樣移植android平臺(tái)-解決iconv庫的移植問題

            http://www.cocoachina.com/bbs/read.php?tid=195310
            當(dāng)我寫這篇文章的時(shí)候我是懷著激動(dòng)的心情的,因?yàn)槲矣纸鉀Q了一個(gè)技術(shù)問題。你可能對(duì)題目還一知半解,這是什么意思,我之所以要寫這篇文章就是要解決當(dāng)我們?cè)赾ocos2dx中使用了第三方庫的時(shí)候,移植到android平臺(tái)的過程中是會(huì)報(bào)錯(cuò)的問題,典型的例子就是我在上幾篇博客中使用了編碼轉(zhuǎn)換的庫iconv,在我移植到android平臺(tái)測試的時(shí)候就出現(xiàn)了錯(cuò)誤,各種各樣的錯(cuò)誤,網(wǎng)上搜了一下,但是網(wǎng)上的方法感覺都很老了,有的也沒說明白,今天通過摸索馬上分享給大家,讓大家也少走歪路。


            如 果你還不會(huì)移植android平臺(tái),請(qǐng)先看我上一篇的博客,先換個(gè)其他的不包含iconv庫的工程,移植成功了再來做今天的事情。今天我們不需要準(zhǔn)備任何 工具,需要做的就是理解.mk文件的含義,知道怎么改。我們先來看一下我字體和字符編碼這篇博客GBKToUTF8的頭文件是怎么包含iconv庫的。


            1
            2
            3
            4
            5
            #if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
            #include "iconv\iconv.h"
            #else
            #include "../../../../libiconv/include/iconv.h"
            #endif


            如果是win32平臺(tái)的話就用引擎里邊的第三方庫,這個(gè)iconv庫所在的路徑是:
            E:\cocos2d-x-2.2\cocos2d-x-2.2\cocos2dx\platform\third_party\win32\iconv。但如果是移植到android平臺(tái)的你需要加上你android平臺(tái)的庫的路徑,也就是說你需要先下載好iconv的庫,放到一個(gè)你的路徑,這里我放到的是我引擎的根目錄下,所以寫的就是上邊的代碼,大家下去下載這個(gè)庫,然后按我說的改了代碼。然后我們就來看看這個(gè).mk文件改怎么改,我們要修改的是jni目錄下的.mk文件,我先截上幾張圖片,說說里邊代碼的含義。

            上邊的這張圖片網(wǎng)上有不少的教程都說需要修改,但在我看來根本不是,因?yàn)楫?dāng)我在這里加了iconv.h的路徑以后編譯的時(shí)候任然報(bào)錯(cuò),說找不到iconv.h這個(gè)文件。所以以后大家也不要改這里,沒用的。


            上 邊的第一張圖片看到了劃線的地方了嗎?這個(gè)是我加上去的,你需要改嗎?答案是需要的,但是名字可以和我不一樣,那名字改成什么樣的呢,這得看另一個(gè)文件 了,我們等等再說。上面的第二張圖片那個(gè)劃線的地方也是我加上去的,你也需要修改,改成什么也需要看另一個(gè)文件。好了現(xiàn)在我們就來說到底看哪個(gè)文件。這個(gè)文件就是你下載的iconv庫的根目錄下的Android.mk文件,我再來截張圖。

            這個(gè)是文件中的倆句話,你要和上邊我說的改的那倆個(gè)地方對(duì)照起來改。好了其實(shí)就是這么簡單,Android.mk文件只需要對(duì)照的改上倆個(gè)地方就可以了,程序中的那個(gè)頭文件包含也要修改。現(xiàn)在我們就來導(dǎo)入到工程中構(gòu)建一下工程吧。在構(gòu)建的時(shí)候也會(huì)出現(xiàn)一個(gè)問題,我想這個(gè)問題的原因可能是因?yàn)閕conv庫里邊實(shí)現(xiàn)的函數(shù)不一樣吧,出現(xiàn)的錯(cuò)誤的語句是這句:
            1
            -1 == iconv(iconvH, pin, &strLength, &outbuf, &outLength)

            我們需要做如下的修改,就是在pin的前邊加個(gè)強(qiáng)轉(zhuǎn),因?yàn)锳ndroid下函數(shù)需要傳入的參數(shù)是char**,而我們程序中的pin是const char **類型的。


            1
            -1 == iconv(iconvH, (char **)pin, &strLength, &outbuf, &outLength)

            有了以上的這些操作問題就解決了,這里提醒一下大家,在eclipse中構(gòu)建工程的時(shí)候如果可以編譯通過了,但是工程中有錯(cuò)誤提示(其實(shí)是沒有錯(cuò)誤的,也不知道這個(gè)eclipse是怎么回事),大家就重新導(dǎo)入工程一遍,問題就解決了,還有什么問題就給我留言吧。
            本帖有小塔原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處!

            android 下添加iconv支持

            NDK自帶的iconv的 查看 android-ndk-r9d/sources/android/support/include/iconv.h

            在Android.mk中加入
            LOCAL_WHOLE_STATIC_LIBRARIES += android_support

            $(call import-module,android/support)


            如:

            LOCAL_PATH := $(call my-dir)

            include $(CLEAR_VARS)
            LOCAL_MODULE := mylib
            LOCAL_SRC_FILES := mylib.cpp

            LOCAL_WHOLE_STATIC_LIBRARIES += android_support
            LOCAL_CXXFLAGS += -std=c++11 -fexceptions


            include $(BUILD_SHARED_LIBRARY)
            $(call import-module, android/support)

            posted @ 2014-12-13 15:56 多彩人生 閱讀(1326) | 評(píng)論 (0)編輯 收藏

            如何在真機(jī)上調(diào)試Android應(yīng)用程序

                 摘要: http://www.cnblogs.com/lanxuezaipiao/archive/2013/03/11/2953564.html1、首先將手機(jī)設(shè)置為調(diào)試模式 方法:設(shè)置——應(yīng)用程序——開發(fā)——USB調(diào)試,打上√即可     2、用數(shù)據(jù)線連接至電腦,在電腦上安裝豌豆莢,此時(shí)豌豆莢會(huì)幫你安裝...  閱讀全文

            posted @ 2014-12-12 15:49 多彩人生 閱讀(633) | 評(píng)論 (0)編輯 收藏

            一步一步了解Cocos2dx 3.0 正式版本開發(fā)環(huán)境搭建(Win32/Android)

            http://www.cnblogs.com/ShadowLoki/p/3679929.html

             cocos2d-x 3.0發(fā)布有一段時(shí)間了,作為一個(gè)初學(xué)者,我一直覺得cocos2d-x很坑。每個(gè)比較大的版本變動(dòng),都會(huì)有不一樣的項(xiàng)目創(chuàng)建方式,每次的跨度都挺大……

              但是憑心而論,3.0RC版本開始 環(huán)境搭建、項(xiàng)目創(chuàng)建、編譯的方式更加人性化了。

              現(xiàn)在我們進(jìn)入正題,一步一步搭建cocos2dx的開發(fā)環(huán)境

              

             

              cocos2d-x很多tools都是需要使用Python的,因此我們需要先安裝Python環(huán)境

              

              python下載:點(diǎn)這里

                這里需要下載Python 2.X版本。曾經(jīng)以為要下載3.x版本 后來裝上發(fā)現(xiàn)cocos2d-x提供的python運(yùn)行報(bào)錯(cuò),所以卸載以后重新裝的python2.X版本

              

              python安裝的時(shí)候使用默認(rèn)安裝方式即可,但是安裝完畢后我們需要配置環(huán)境變量

                在我的電腦(右鍵)->屬性->高級(jí)系統(tǒng)設(shè)置->高級(jí) 選項(xiàng)卡->環(huán)境變量->系統(tǒng)變量 中找到Path 變量,并在其值中增加 指向Python的環(huán)境變量。格式為 [Python安裝路徑]; 例如我安裝在C盤 我的環(huán)境變量就新增為 C:\Python27;

                配置完畢后記得注銷再重新登陸系統(tǒng)環(huán)境變量才會(huì)生效

                

             

              下一步,我們要下載最新版本的cocos2d-x,到目前為止 cocos2d-x已經(jīng)更新到 3.0rc2版本

              

              cocos2d-x官網(wǎng): 點(diǎn)這里

              

              在下載完畢后我們解壓縮到磁盤上,并打開cocos2d-x 文件夾找到setup.py這個(gè)文件,運(yùn)行,會(huì)出現(xiàn)控制臺(tái)如下

              

              由于現(xiàn)在不配置Android環(huán)境,因此只需要一直回車即可,這時(shí)候這段python腳本會(huì)幫助我們?cè)O(shè)置cocos2d-x運(yùn)行所需要的環(huán)境變量。繼續(xù)注銷……重新登陸……

              在配置完這一切后 我們打開CMD 運(yùn)行cocos命令,1來檢查整個(gè)開發(fā)環(huán)境是否搭建成功,2來可以熟悉下命令行,如果設(shè)置沒問題的情況下 會(huì)出現(xiàn)如下界面

              這里我們可以看到cocos.py這段腳本可以執(zhí)行4個(gè)命令,每個(gè)命令的作用已經(jīng)說明的很清楚了。

             

              下面,我們來使用new 命令創(chuàng)建我們的項(xiàng)目

              

              這里舉個(gè)栗子,比如我要?jiǎng)?chuàng)建一個(gè)叫simple的項(xiàng)目,我們可以這么寫 cocos new -p com.game.simple -l cpp -d e:\  simple 簡單吧 運(yùn)行這條命令會(huì)在E盤根目錄下生成一個(gè)叫simple的文件夾里面放著我們的項(xiàng)目。

              

              這個(gè)時(shí)候我們就可以用VS2012打開proj.win32中的SLN項(xiàng)目文件進(jìn)行我們愉快的編碼和調(diào)試工作了。

             

              如果我們要運(yùn)行我們剛剛由模板生成的項(xiàng)目,我們需要用到cocos run 命令 格式為 cocos run -p [平臺(tái)]    栗如:cocos run -p win32 表示win32平臺(tái)

              我們?cè)趫?zhí)行這條命令時(shí)候需要注意一點(diǎn) 執(zhí)行命令的目錄 必須是游戲項(xiàng)目的根目錄 如果不在根目錄 需要使用 -s指定游戲根目錄的位置

              

              現(xiàn)在我們?cè)赾md中執(zhí)行 cocos run -p win32 -s e:\simple 運(yùn)行結(jié)果如下

              

              如果在編譯過程中沒有錯(cuò)誤的話 編譯完成會(huì)打開這個(gè)HelloWorld的DEMO

              至此在WIN32中的環(huán)境搭建以及調(diào)試發(fā)布就全部OK了 下面我們來看Android部分。

              
            Android:

              Android的編譯環(huán)境在3.0RC里也有了很大的改觀,部署和編譯方式比之前方便了很多?,F(xiàn)在我們來做下準(zhǔn)備工作。

              Android編譯環(huán)境需要用到Andorid_SDK  Android_NDK   Ant 與JDK

              Android_SDK下載: 點(diǎn)這里

              Android_NDK下載: 點(diǎn)這里

              Android_JDK下載:  點(diǎn)這里

              Ant下載:         點(diǎn)這里

              

              其中除了JDK需要安裝,其它的是綠色版 直接解壓即可

                我們將SDK NDK 和ANT解壓縮到同一個(gè)文件夾中 并修改sdk的文件夾名為ADT,NDK的NDK,ANT的為ANT 這是為了方便以后使用。 我解壓后文件都放在了e:\Android文件夾下

              

              

              解壓完后我們先來配置JDK

                在JDK安裝完畢之后,需要手動(dòng)進(jìn)行環(huán)境變量的配置

              

                 1)在系統(tǒng)變量里新建JAVA_HOME變量,變量值為:C:\Program Files\Java\jdk1.6.0_14(根據(jù)自己的安裝路徑填寫)

                2)新建classpath變量,變量值為:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar (注意前面的. 不要忘記了)

                3)在path變量(已存在不用新建)添加變量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin(注意變量值之間用“;”隔開)

                4、重新注銷系統(tǒng)并重新登陸后 “開始”-->“運(yùn)行”-->輸入“javac”-->"Enter",如果能正常打印用法說明配置成功!

                補(bǔ)充環(huán)境變量的解析:

                  JAVA_HOME:jdk的安裝路徑

             

                  classpath:java加載類路徑,只有類在classpath中java命令才能識(shí)別,在路徑前加了個(gè)"."表示當(dāng)前路徑。

             

                  path:系統(tǒng)在任何路徑下都可以識(shí)別java,javac命令。

              

             

              

               現(xiàn)在我們來配置ANT的環(huán)境變量。將[ANT目錄]\bin文件夾添加到path中  如圖

              

             

              至此準(zhǔn)備工作就做完了,下面我們運(yùn)行setup.py關(guān)聯(lián)SDK NDK 和ANT

             

              

              在這里我們輸入了ndk和sdk的路徑 其中ndk指向根目錄即可  而sdk需要指向adt中的sdk目錄

              

              在由setup.py添加了這兩個(gè)環(huán)境變量之后 會(huì)要求我們輸入Ant的路徑 這里我們需要指向ant中的bin文件夾 如下:

              

              這時(shí)候 基本環(huán)境已經(jīng)搭建完成了,記得注銷重新登陸使環(huán)境變量生效

               重新運(yùn)行setup.py確認(rèn)下所有的配置是否正確 如果全部正確 如圖所示

              

             

              然后我們就可以在項(xiàng)目目錄下使用 cocos compile -p android方式編譯APK文件了

              

              注意:在打包apk之前需要修改proj.android/jni文件夾下的Android.mk文件 添加自己新增的CPP文件

             

              最后我們來看看編譯好的APK文件吧,位置在[項(xiàng)目文件夾]\bin\debug\android\文件夾下

              

            posted @ 2014-10-15 15:35 多彩人生 閱讀(377) | 評(píng)論 (0)編輯 收藏

            用VS2010編譯luabind

            http://www.shnenglu.com/eros/archive/2009/04/29/81508.aspx

                 學(xué)了一段時(shí)間Lua,顯然直接在項(xiàng)目中使用是很不方便,google了一下,似乎大家都對(duì)luabind這個(gè)lua包裝類青睞有加,于是我也隨大勢想用用看。
                 先做好準(zhǔn)備工作,下載了luabin 0.8.1源碼,Boost 1.3.8源碼和lua 5.1.4源碼,編譯環(huán)境是VS2008 SP1。之前在網(wǎng)上看到一些文章說這些開源軟件之間的版本依賴比較敏感,可能會(huì)有這樣那樣的問題,動(dòng)手之前有些惶恐。
                 幸運(yùn)的是,編譯過程很順利,如下:
                 1.編譯lua 5.1.4
                 進(jìn)入VS2008的命令行工具,定位到lua的源碼目錄下,執(zhí)行命令etc\luavs.bat,沒什么問題的話很快就可以編譯好lua,得到lua51.lib和lua51.dll。
                 2.編譯luabind
                 解壓下載回來的luabind壓縮包,假設(shè)解壓到d:\luabind-0.8.1\,Boost解壓到d:\boost 1_38_0\,lua解壓到d:\lua 5.1.4\
                 在 VS中新建一個(gè)靜態(tài)庫項(xiàng)目,將d:\luabind-0.8.1\src下的源碼全部添加到項(xiàng)目中,然后在項(xiàng)目中新建luabind和luabind \detail\兩個(gè)虛擬文件夾,對(duì)應(yīng)的將d:\luabind-0.8.1\luabind和d:\luabind-0.8.1\luabind \detail下的文件添加到文件夾中。
                 然后為項(xiàng)目添加附加包含目錄,右鍵點(diǎn)擊項(xiàng)目節(jié)點(diǎn)->屬性->配置屬性->C\C++標(biāo)簽下,在附加包含目錄中填入d: \luabind-0.8.1\;d:\boost 1_38_0\k;d:\lua 5.1.4\src\。然后修改項(xiàng)目字符集為多字節(jié)字符集。
                 準(zhǔn)備就緒,生成項(xiàng)目。在我的環(huán)境中編譯很順利,沒有出現(xiàn)任何問題,成功后會(huì)得到luabind.lib。

                 接下來就按照慣例來寫一個(gè)hello world程序作為使用luabind的第一步。
                 在VS中新建一個(gè)控制臺(tái)項(xiàng)目,類型為DLL,命名項(xiàng)目為Hello World,然后鍵入以下代碼:

             1#include "stdafx.h"
             2#include <iostream>
             3#include <luabind/luabind.hpp>
             4
             5void greet()
             6{
             7    std::cout << "hello world!\n";
             8}

             9
            10extern "C" int __declspec(dllexport) init(lua_State* L)
            11{
            12    using namespace luabind;
            13
            14    open(L);
            15
            16    module(L)
            17    [
            18        def("greet"&greet)
            19    ];
            20
            21    return 0;
            22}


               注意,在Windows環(huán)境下init函數(shù)之前是要加 __declspec(dllexport)才能將函數(shù)導(dǎo)出的,而luabind的文檔中的環(huán)境是linux,默認(rèn)不用加 __declspec(dllexport)也可以導(dǎo)出(就因?yàn)檫@個(gè)折騰了我半天才把hello word成功運(yùn)行)。
               編譯項(xiàng)目,(記得將luabind.lib和lua51.lib添加到鏈接選項(xiàng)中:項(xiàng)目屬性->連接器->輸入->附加依賴文件,加入luabind.lib和lua51.lib)。
               將hello world.dll放到lua51.dll和lua.exe所在的目錄下。
               打開lua命令行,鍵入:
                
               測試成功,enjoy。

            posted @ 2014-09-02 17:56 多彩人生 閱讀(382) | 評(píng)論 (0)編輯 收藏

            常函數(shù)與重載

            關(guān)于常函數(shù)
            1》常對(duì)象只能調(diào)用常函數(shù),常函數(shù)里面不能對(duì)數(shù)據(jù)成員做出更改,否則編譯出錯(cuò)
            2》非常對(duì)象可以調(diào)用常函數(shù)
            3》常量成員可以在構(gòu)造函數(shù)的成員函數(shù)初始化列表初始化。
            4》const關(guān)鍵字可以用于參與重載函數(shù)的區(qū)分。例如:
                void Print();
                void Print() const;
                這兩個(gè)函數(shù)可以用于重載。重載的原則是:常對(duì)象調(diào)用常成員函數(shù),一般對(duì)象調(diào)用一般成員函數(shù)。
            5》在const成員函數(shù)中:  
              可以修改被定義成mutable的成員變量
            6》函數(shù)重載要求編譯器能夠唯一地確定調(diào)用一個(gè)函數(shù)時(shí)應(yīng)執(zhí)行哪個(gè)函數(shù)代碼,即采用哪個(gè)函數(shù)實(shí)現(xiàn)。確定函數(shù)實(shí)現(xiàn)時(shí),要求從函數(shù)參數(shù)的個(gè)數(shù)和類型上來區(qū)分。這就是說,進(jìn)行函數(shù)重載時(shí),要求同名函數(shù)在參數(shù)個(gè)數(shù)上不同,或者參數(shù)類型上不同。否則,將無法實(shí)現(xiàn)重載。

            posted @ 2014-08-29 20:56 多彩人生 閱讀(646) | 評(píng)論 (0)編輯 收藏

            淺析Lua中table的遍歷

            http://rangercyh.blog.51cto.com/1444712/1032925

            當(dāng)我在工作中使用lua進(jìn)行開發(fā)時(shí),發(fā)現(xiàn)在lua中有4種方式遍歷一個(gè)table,當(dāng)然,從本質(zhì)上來說其實(shí)都一樣,只是形式不同,這四種方式分別是:

            1. for key, value in pairs(tbtest) do  
            2. XXX  
            3. end 
            4.  
            5. for key, value in ipairs(tbtest) do  
            6. XXX  
            7. end 
            8.  
            9. for i=1, #(tbtest) do  
            10.     XXX  
            11. end 
            12.  
            13. for i=1, table.maxn(tbtest) do  
            14.     XXX  
            15. end 

            前兩種是泛型遍歷,后兩種是數(shù)值型遍歷。當(dāng)然你還會(huì)說lua的table遍歷還有很多種方法啊,沒錯(cuò),不過最常見的這些遍歷確實(shí)有必要弄清楚。

            這四種方式各有特點(diǎn),由于在工作中我?guī)缀趺刻於紩?huì)使用遍歷table的方法,一開始也非常困惑這些方式的不同,一段時(shí)間后才漸漸明白,這里我也是把 自己的一點(diǎn)經(jīng)驗(yàn)告訴大家,對(duì)跟我一樣的lua初學(xué)者也許有些幫助(至少當(dāng)初我在寫的時(shí)候在網(wǎng)上就找了很久,不知道是因?yàn)榇笈兌颊J(rèn)為這些很簡單,不需要 說,還是因?yàn)槲冶浚B這都要問)。

            首先要明確一點(diǎn),就是lua中table并非像是C/C++中的數(shù)組一樣是順序存儲(chǔ)的,準(zhǔn)確來說lua中的table更加像是C++中的map,通 過Key對(duì)應(yīng)存儲(chǔ)Value,但是并非順序來保存key-value對(duì),而是使用了hash的方式,這樣能夠更加快速的訪問key對(duì)應(yīng)的value,我們 也知道hash表的遍歷需要使用所謂的迭代器來進(jìn)行,同樣,lua也有自己的迭代器,就是上面4種遍歷方式中的pairs和ipairs遍歷。但是lua 同時(shí)提供了按照key來遍歷的方式(另外兩種,實(shí)質(zhì)上是一種),正式因?yàn)樗峁┝诉@種按key的遍歷,才造成了我一開始的困惑,我一度認(rèn)為lua中關(guān)于 table的遍歷是按照我table定義key的順序來的。

            下面依次來講講四種遍歷方式,首先來看for k,v in pairs(tbtest) do這種方式:

            先看效果:

            1. tbtest = {  
            2.     [1] = 1,  
            3.     [2] = 2,  
            4.     [3] = 3,  
            5.     [4] = 4,  
            6.  
            7. for key, value in pairs(tbtest) do  
            8.     print(value)  
            9. end 

            我認(rèn)為輸出應(yīng)該是1,2,3,4,實(shí)際上的輸出是1,2,4,3。我因?yàn)檫@個(gè)造成了一個(gè)bug,這是后話。

            也就是說for k,v in pairs(tbtest) do 這樣的遍歷順序并非是tbtest中table的排列順序,而是根據(jù)tbtest中key的hash值排列的順序來遍歷的。

             

            當(dāng)然,同時(shí)lua也提供了按照key的大小順序來遍歷的,注意,是大小順序,仍然不是key定義的順序,這種遍歷方式就是for k,v in ipairs(tbtest) do。

            for k,v in ipairs(tbtest) do 這樣的循環(huán)必須要求tbtest中的key為順序的,而且必須是從1開始,ipairs只會(huì)從1開始按連續(xù)的key順序遍歷到key不連續(xù)為止。

            1. tbtest = {  
            2. [1] = 1,  
            3. [2] = 2,  
            4. [3] = 3,  
            5. [5] = 5,  
            6.  
            7. for k,v in ipairs(tbtest) do  
            8. print(v)  
            9. end 

            只會(huì)打印1,2,3。而5則不會(huì)顯示。

            1. local tbtest = {  
            2. [2] = 2,  
            3. [3] = 3,  
            4. [5] = 5,  
            5.  
            6. for k,v in ipairs(tbtest) do  
            7. print(v)  
            8. end 

            這樣就一個(gè)都不會(huì)打印。

             

            第三種遍歷方式有一種神奇的符號(hào)'#',這個(gè)符號(hào)的作用是是獲取table的長度,比如:

            1. tbtest = {  
            2. [1] = 1,  
            3. [2] = 2,  
            4. [3] = 3,  
            5. }  
            6. print(#(tbtest)) 

            打印的就是3

            1. tbtest = {  
            2. [1] = 1,  
            3. [2] = 2,  
            4. [6] = 6,  
            5. }  
            6. print(#(tbtest)) 

            這樣打印的就是2,而且和table內(nèi)的定義順序沒有關(guān)系,無論你是否先定義的key為6的值,‘#’都會(huì)查找key為1的值開始。

            如果table的定義是這樣的:

            1. tbtest = {  
            2. ["a"] = 1,  
            3. [2] = 2,  
            4. [3] = 3,  
            5.  
            6. print(#(tbtest)) 

            那么打印的就是0了。因?yàn)?#8216;#’沒有找到key為1的值。同樣:

            1. tbtest = {  
            2. [“a”] = 1,  
            3. [“b”] = 2,  
            4. [“c”] = 3,  
            5. }  
            6. print(#(tbtest)) 

            打印的也是0

            所以,for i=1, #(tbtest) do這種遍歷,只能遍歷當(dāng)tbtest中存在key為1的value時(shí)才會(huì)出現(xiàn)結(jié)果,而且是按照key從1開始依次遞增1的順序來遍歷,找到一個(gè)遞增不是1的時(shí)候就結(jié)束不再遍歷,無論后面是否仍然是順序的key,比如:

             

            table.maxn獲取的只針對(duì)整數(shù)的key,字符串的key是沒辦法獲取到的,比如:

            1. tbtest = {  
            2. [1] = 1,  
            3. [2] = 2,  
            4. [3] = 3,  
            5. }  
            6. print(table.maxn(tbtest)) 
            7.  
            8.  
            9. tbtest = {  
            10. [6] = 6,  
            11. [1] = 1,  
            12. [2] = 2,  
            13. }  
            14. print(table.maxn(tbtest)) 

            這樣打印的就是3和6,而且和table內(nèi)的定義順序沒有關(guān)系,無論你是否先定義的key為6的值,table.maxn都會(huì)獲取整數(shù)型key中的最大值。

            如果table的定義是這樣的:

            1. tbtest = {  
            2. ["a"] = 1,  
            3. [2] = 2,  
            4. [3] = 3,  
            5. }  
            6. print(table.maxn(tbtest)) 

            那么打印的就是3了。如果table是:

            1. tbtest = {  
            2. [“a”] = 1,  
            3. [“b”] = 2,  
            4. [“c”] = 3,  
            5. }  
            6. print(table.maxn(tbtest))  
            7. print(#(tbtest)) 

            那么打印的就全部是0了。

             

             

            換句話說,事實(shí)上因?yàn)閘ua中table的構(gòu)造表達(dá)式非常靈活,在同一個(gè)table中,你可以隨意定義各種你想要的內(nèi)容,比如:

            1. tbtest = {  
            2. [1] = 1,  
            3. [2] = 2,  
            4. [3] = 3,  
            5. ["a"] = 4,  
            6. ["b"] = 5,  

            同時(shí)由于這個(gè)靈活性,你也沒有辦法獲取整個(gè)table的長度,其實(shí)在coding的過程中,你會(huì)發(fā)現(xiàn),你真正想要獲取整個(gè)table長度的地方幾乎沒有,你總能采取一種非常巧妙的定義方式,把這種需要獲取整個(gè)table長度的操作避免掉,比如:

            1. tbtest = {  
            2. tbaaa = {  
            3. [1] = 1,  
            4. [2] = 2,  
            5. [3] = 3,  
            6. },  
            7. ["a"] = 4,  
            8. ["b"] = 5,  

            你可能會(huì)驚訝,上面這種table該如何遍歷呢?

            1. for k, v in pairs(tbtest) do  
            2. print(k, v)  
            3. end 

            輸出是:a 4 b 5 tbaaa table:XXXXX。

            由此你可以看到,其實(shí)在table中定義一個(gè)table,這個(gè)table的名字就是key,對(duì)應(yīng)的內(nèi)容其實(shí)是table的地址。

            當(dāng)然,如果你用

            1. for k, v in ipairs(tbtest) do  
            2. print(k,v)  
            3. end 

            來遍歷的話,就什么都不會(huì)打印,因?yàn)闆]有key為1的值。但當(dāng)你增加一個(gè)key為1的值時(shí),ipairs只會(huì)打印那一個(gè)值,現(xiàn)在你明白ipairs是如何工作的吧。

            既然這里談到了遍歷,就說一下目前看到的幾種針對(duì)table的遍歷方式:

            for i=1, #tbtest do --這種方式無法遍歷所有的元素,因?yàn)?#'只會(huì)獲取tbtest中從key為1開始的key連續(xù)的那幾個(gè)元素,如果沒有key為1,那么這個(gè)循環(huán)將無法進(jìn)入

            for i=1, table.maxn(tbtest) do --這種方式同樣無法遍歷所有的元素,因?yàn)閠able.maxn只會(huì)獲取key為整數(shù)中最大的那個(gè)數(shù),遍歷的元素其實(shí)是查找 tbtest[1]~tbtest[整數(shù)key中最大值],所以,對(duì)于string做key的元素不會(huì)去查找,而且這么查找的效率低下,因?yàn)槿绻阏麛?shù) key中定義的最大的key是10000,然而10000以下的key沒有幾個(gè),那么這么遍歷會(huì)浪費(fèi)很多時(shí)間,因?yàn)闀?huì)從1開始直到10000每一個(gè)元素都 會(huì)查找一遍,實(shí)際上大多數(shù)元素都是不存在的,比如:

            1. tbtest = {  
            2. [1] = 1,  
            3. [10000] = 2,  
            4. }  
            5. local count = 0  
            6. for i=1, table.maxn(tbtest) do  
            7. count = count + 1  
            8. print(tbtest[i])  
            9. end  
            10. print(count) 

            你會(huì)看到打印結(jié)果是多么的坑爹,只有1和10000是有意義的,其他的全是nil,而且count是10000。耗時(shí)非常久。一般我不這么遍歷。但是有一種情況下又必須這么遍歷,這個(gè)在我的工作中還真的遇到了,這是后話,等講完了再談。

            1. for k, v in pairs(tbtest) do 

            這個(gè)是唯一一種可以保證遍歷tbtest中每一個(gè)元素的方式,別高興的太早,這種遍歷也有它自身的缺點(diǎn),就是遍歷的順序不是按照tbtest定義的順序來遍歷的,這個(gè)前面講到過,當(dāng)然,對(duì)于不需要順序遍歷的用法,這個(gè)是唯一可靠的遍歷方式。

            1. for k, v in ipairs(tbtest) do 

            這個(gè)只會(huì)遍歷tbtest中key為整數(shù),而且必須從1開始的那些連續(xù)元素,如果沒有1開始的key,那么這個(gè)遍歷是無效的,我個(gè)人認(rèn)為這種遍歷方 式完全可以被改造table和for i=1, #(tbtest) do的方式來代替,因?yàn)閕pairs的效果和'#'的效果,在遍歷的時(shí)候是類似的,都是按照key的遞增1順序來遍歷。

            好,再來談?wù)劄槭裁次倚枰褂胻able.maxn這種非常浪費(fèi)的方式來遍歷,在工作中, 我遇到一個(gè)問題,就是需要把當(dāng)前的周序,轉(zhuǎn)換成對(duì)應(yīng)的獎(jiǎng)勵(lì),簡單來說,就是從一個(gè)活動(dòng)開始算起,每周的獎(jiǎng)勵(lì)都不是固定的,比如1~4周給一種獎(jiǎng)勵(lì),5~8 周給另一種獎(jiǎng)勵(lì),或者是一種排名獎(jiǎng)勵(lì),1~8名給一種獎(jiǎng)勵(lì),9~16名給另一種獎(jiǎng)勵(lì),這種情況下,我根據(jù)長久的C語言的習(xí)慣,會(huì)把table定義成這個(gè)樣 子:

            1. tbtestAward = {  
            2. [8] = 1,  
            3. [16] = 3,  

            這個(gè)代表,1~8給獎(jiǎng)勵(lì)1,9~16給獎(jiǎng)勵(lì)3。這樣定義的好處是獎(jiǎng)勵(lì)我只需要寫一次(這里的獎(jiǎng)勵(lì)用數(shù)字做了簡化,實(shí)際上獎(jiǎng)勵(lì)也是一個(gè)大的 table,里面還有非常復(fù)雜的結(jié)構(gòu))。然后我就遇到一個(gè)問題,即我需要根據(jù)周序數(shù),或者是排名序數(shù)來確定給哪一種獎(jiǎng)勵(lì),比如當(dāng)前周序數(shù)是5,那么我應(yīng)該 給我定義好的key為8的那一檔獎(jiǎng)勵(lì),或者當(dāng)前周序數(shù)是15,那么我應(yīng)該給獎(jiǎng)勵(lì)3。由此讀者看出,其實(shí)我定義的key是一個(gè)分界,小于這個(gè)key而大于上 一個(gè)key,那么就給這個(gè)key的獎(jiǎng)勵(lì),這就是我判斷的條件。邏輯上沒有問題,但是lua的遍歷方式卻把我狠狠地坑了一把。讀者可以自己想一想我上面介紹 的4種遍歷方式,該用哪一種來實(shí)現(xiàn)我的這種需求呢?這個(gè)函數(shù)的大致框架如下:

            1. function GetAward(nSeq)  
            2. for 遍歷整個(gè)獎(jiǎng)勵(lì)表 do  
            3. if 滿足key的條件 then  
            4. return 返回對(duì)應(yīng)獎(jiǎng)勵(lì)的key  
            5. end  
            6. end  
            7. return nil  
            8. end 

            我也不賣關(guān)子了,分別來說一說吧,首先因?yàn)槲业膋ey不是連續(xù)的,而且沒有key為1的值,所以ipairs和'#'遍歷是沒用的。這種情況下理想 的遍歷貌似是pairs,因?yàn)樗鼤?huì)遍歷我的每一個(gè)元素,但是讀者不要忘記了,pairs遍歷并非是按照我定義的順序來遍歷,如果我真的使用的條件是:序數(shù) nSeq小于這個(gè)key而大于上一個(gè)key,那么就返回這個(gè)key。那么我無法保證程序執(zhí)行的正確性,因?yàn)閗ey的順序有可能是亂的,也就是有可能先遍歷 到的是key為16的值,然后才是key為8的值。

            這么看來我只剩下table.maxn這么一種方式了,于是我寫下了這種代碼:

            1. for i=1, table.maxn(tbtestAward) do  
            2. if tbtestAward[i] ~= nil then  
            3. if nSeq <= i then  
            4. return i  
            5. end  
            6. end  
            7. end  

            這么寫效率確實(shí)低下,因?yàn)閷?shí)際上還是遍歷了從key為1開始直到key為table.maxn中間的每一個(gè)值,不過能夠滿足我上面的要求。當(dāng)時(shí)我是 這么實(shí)現(xiàn)的,因?yàn)檫@個(gè)獎(jiǎng)勵(lì)表會(huì)不斷的發(fā)生變化,這樣我每次修改只需要修改這個(gè)獎(jiǎng)勵(lì)表就能夠滿足要求了,后來我想了想,覺得其實(shí)我如果自己再定義一個(gè)序數(shù)轉(zhuǎn) 換成對(duì)應(yīng)的獎(jiǎng)勵(lì)數(shù)種類的表就可以避免這種坑爹的操作了,不過如果獎(jiǎng)勵(lì)發(fā)生修改,我需要統(tǒng)一排查的地方就不止這個(gè)獎(jiǎng)勵(lì)表了,權(quán)衡再三,我還是沒有改,就這么 寫了。沒辦法,不斷變化的需求已經(jīng)把我磨練的忘記了程序的最高理想。我甚至愿意犧牲算法的效率而去追求改動(dòng)的穩(wěn)定性。在此哀悼程序員的無奈。我這種時(shí)間換 空間的做法確實(shí)不知道好不好。

            后來我在《Programming In Lua》中看到了一個(gè)神奇的迭代器,使用它就可以達(dá)到我想要的這種遍歷方式,而且不需要去遍歷那些不存在的key。它的方法是把你所需要遍歷的table 里的key按照遍歷順序放到另一個(gè)臨時(shí)的table中去,這樣只需要遍歷這個(gè)臨時(shí)的table按順序取出原table中的key就可以了。如下:

            首先定義一個(gè)迭代器:

            1. function pairsByKeys(t)  
            2.     local a = {}  
            3.     for n in pairs(t) do  
            4.         a[#a+1] = n  
            5.     end  
            6.     table.sort(a)  
            7.     local i = 0  
            8.     return function()  
            9.         i = i + 1  
            10.         return a[i], t[a[i]]  
            11.     end  
            12. end 

            然后在遍歷的時(shí)候使用這個(gè)迭代器就可以了,table同上,遍歷如下:

            1. for key, value in pairsByKeys(tbtestAward) do  
            2.  if nSeq <= key then  
            3. return key  
            4. end  
            5. end 

            并且后來我發(fā)現(xiàn)有了這個(gè)迭代器,我根本不需要先做一步獲取是哪一檔次的獎(jiǎng)勵(lì)的操作,直接使用這個(gè)迭代器進(jìn)行發(fā)獎(jiǎng)就可以了。大師就是大師,我怎么就沒想到呢!

            還有些話我還沒有說,比如上面數(shù)值型遍歷也并非是像看起來那樣進(jìn)行遍歷的,比如下面的遍歷:

            1. tbtest = {  
            2.     [1] = 1,  
            3.     [2] = 2,  
            4.     [3] = 3,  
            5.     [5] = 5,  
            6.  
            7. for i=1, #(tbtest) do  
            8.     print(tbtest[i])  
            9. end 

            打印的順序是:1,2,3。不會(huì)打印5,因?yàn)?已經(jīng)不在table的數(shù)組數(shù)據(jù)塊中了,我估計(jì)是被放到了hash數(shù)據(jù)塊中,但是當(dāng)我修改其中的一些key時(shí),比如:

            1. tbtest = {  
            2.     [1] = 1,  
            3.     [2] = 2,  
            4.     [4] = 4,  
            5.     [5] = 5,  
            6.  
            7. for i=1, #(tbtest) do  
            8.     print(tbtest[i])  
            9. end 

            打印的內(nèi)容卻是:1,2,nil,4,5。這個(gè)地方又遍歷到了中間沒有的key值,并且還能繼續(xù)遍歷下去。我最近正在看lua源碼中table的實(shí) 現(xiàn)部分,已經(jīng)明白了是怎么回事,不過我想等我能夠更加清晰的闡述lua中table的實(shí)現(xiàn)過程了再向大家介紹。用我?guī)煾档脑捳f就是不要使用一些未定義的行 為方法,避免在工作中出錯(cuò),不過工作外,我還是希望能明白未定義的行為中那些必然性,o(︶︿︶)o 唉!因果論的孩子傷不起。等我下一篇博文分析lua源碼中table的實(shí)現(xiàn)就能夠更加清晰的說明這些了。

            posted @ 2014-08-25 14:29 多彩人生 閱讀(306) | 評(píng)論 (0)編輯 收藏

            lua require dofile loadfile區(qū)別

            http://blog.163.com/hbu_lijian/blog/static/126129153201422902256778/

            1.dofile與loadfile
            dofile 當(dāng)作Lua運(yùn)行代碼的chunk的一種原始的操作。dofile實(shí)際上是一個(gè)輔助的函數(shù)。真正完成功能的函數(shù)是loadfile;與dofile不同的是 loadfile編譯代碼成中間碼并且返回編譯后的chunk作為一個(gè)函數(shù),而不執(zhí)行代碼;另外loadfile不會(huì)拋出錯(cuò)誤信息而是返回錯(cuò)誤代。我們可 以這樣定義dofile:
            function dofile (filename)
            local f = assert(loadfile(filename))
            return f()
            end
            如 果loadfile失敗assert會(huì)拋出錯(cuò)誤。loadfile更加靈活。在發(fā)生錯(cuò)誤的情況下,loadfile返回nil和錯(cuò)誤信息,這樣我們就可以 自定義錯(cuò)誤處理。另外,如果我們運(yùn)行一個(gè)文件多次的話,loadfile只需要編譯一次,但可多次運(yùn)行。dofile卻每次都要編譯。
            2.loadstring與loadfile
            loadstring與loadfile相似,只不過它不是從文件里讀入chunk,而是從一個(gè)串中讀入。
            f = loadstring("i = i + 1")
            loadstring 函數(shù)功能強(qiáng)大,但使用時(shí)需多加小心。確認(rèn)沒有其它簡單的解決問題的方法再使用。loadfile和loadstring都不會(huì)拋出錯(cuò)誤,如果發(fā)生錯(cuò)誤他們 將返回nil加上錯(cuò)誤信息。另外,loadfile和loadstring都不會(huì)有邊界效應(yīng)產(chǎn)生,他們僅僅編譯chunk成為自己內(nèi)部實(shí)現(xiàn)的一個(gè)匿名函 數(shù)。通常對(duì)他們的誤解是他們定義了函數(shù)。Lua中的函數(shù)定義是發(fā)生在運(yùn)行時(shí)的賦值而不是發(fā)生在編譯時(shí)。
            loadstring通常用 于運(yùn)行程序外部的代碼,比如運(yùn)行用戶自定義的代碼。注意:loadstring期望一個(gè)chunk,即語句。如果想要加載表達(dá)式,需要在表達(dá)式前加 return,那樣將返回表達(dá)式的值。loadstring返回的函數(shù)和普通函數(shù)一樣,可以多次被調(diào)用。
            print "enter your expression:"
            local l = io.read()
            local func = assert(loadstring("return " .. l))
            print("the value of your expression is " .. func())
            3.require與dofile
            。粗略的說require和dofile完成同樣的功能但有兩點(diǎn)不同:
            1. require會(huì)搜索目錄加載文件
            2. require會(huì)判斷是否文件已經(jīng)加載避免重復(fù)加載同一文件。由于上述特征,require在Lua中是加載庫的更好的函數(shù)。
            require 使用的路徑和普通我們看到的路徑還有些區(qū)別,我們一般見到的路徑都是一個(gè)目錄列表。require的路徑是一個(gè)模式列表,每一個(gè)模式指明一種由虛文件名 (require的參數(shù))轉(zhuǎn)成實(shí)文件名的方法。更明確地說,每一個(gè)模式是一個(gè)包含可選的問號(hào)的文件名。匹配的時(shí)候Lua會(huì)首先將問號(hào)用虛文件名替換,然后 看是否有這樣的文件存在。如果不存在繼續(xù)用同樣的方法用第二個(gè)模式匹配。例如,路徑如下:?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua 
            調(diào)用過程如下:
            lili
            lili.lua
            c:\windows\lili
            /usr/local/lua/lili/lili.lua
            還會(huì)有so/dll文件。
            為了確定路徑,Lua首先檢查全局變量LUA_PATH是否為一個(gè)字符串,如果是則認(rèn)為這個(gè)串就是路徑;否則require檢查環(huán)境變量LUA_PATH的值,如果兩個(gè)都失敗require使用固定的路徑(典型的"?;?.lua")
            一個(gè)路徑中的模式也可以不包含問號(hào)而只是一個(gè)固定的路徑,比如:?;?.lua;/usr/local/default.lua。這種情況下,require沒有匹配的時(shí)候就會(huì)使用這個(gè)固定的文件(當(dāng)然這個(gè)固定的路徑必須放在模式列表的最后才有意義)

            posted @ 2014-08-22 09:24 多彩人生 閱讀(1297) | 評(píng)論 (0)編輯 收藏

            lua中的require機(jī)制

            http://blog.chinaunix.net/uid-552961-id-2736410.html

            lua中的require機(jī)制

                為了方便代碼管理,通常會(huì)把lua代碼分成不同的模塊,然后在通過require函數(shù)把它們加載進(jìn)來。
            現(xiàn)在看看lua的require的處理流程。

            1、require機(jī)制相關(guān)的數(shù)據(jù)和函數(shù)
                package.path:保存加載外部模塊(lua中"模塊"和"文件"這兩個(gè)概念的分界比較含糊,因?yàn)檫@個(gè)值在不同的時(shí)刻會(huì)扮演不同的角色)的搜索 路徑,這種路徑是"模板式的路徑",它里面會(huì)包含可替代符號(hào)"?",這個(gè)符號(hào)會(huì)被替換,然后lua查找這個(gè)文件是否存在,如果存在就會(huì)調(diào)用其中特定的接 口。典型的值為:
                "./?.lua;./?.lc;/usr/local/?/init.lua"
                如果lua代碼中調(diào)用:require("hello.world")
                那么lua會(huì)依次查找:
                ./hello/world.lua ==>這里"hello.world"變成了"hello/world",并替換了模型"./?.lua"
                ./hello/world.lc
                .....
                (這種處理方式和python類似,只不過不需要__init__.py,也有調(diào)用python中的__init__.py)
                package.path在虛擬機(jī)啟動(dòng)的時(shí)候設(shè)置,如果存在環(huán)境變量LUA_PATH,那么就用該環(huán)境變量作為
                它的值,并把這個(gè)環(huán)境變量中的";;"替換為luaconf.h中定義的默認(rèn)值,如果不存在該變量就直接使用
                luaconf.h定義的默認(rèn)值
                
                package.cpath:作用和packag.path一樣,但它是用于加載第三方c庫的。它的初始值可以通過環(huán)境變量
                LUA_CPATH來設(shè)置
                
                package.loadlib(libname, func):相當(dāng)與手工打開c庫libname, 并導(dǎo)出函數(shù)func返回,loadlib其實(shí)是ll_loadlib
                

            2.require的處理流程:
               require(modelname)
               require(在lua中它是ll_require函數(shù))的查找順序如下:
                   a.首先在package.loaded查找modelname,如果該模塊已經(jīng)存在,就直接返回它的值
                   b.在package.preload查找modelname, 如果preload存在,那么就把它作為loader,調(diào)用loader(L)
                   c.根據(jù)package.path的模式查找lua庫modelname,這個(gè)庫是通過module函數(shù)定義的,對(duì)于頂層的lua庫,文件名和庫名是一 樣的而且不需要調(diào)用顯式地在lua文件中調(diào)用module函數(shù)(在ll_require函數(shù)中可以看到處理方式),也就是說lua會(huì)根據(jù)lua文件直接完 成一個(gè)loader的初始化過程。
                   d.根據(jù)package.cpath查找c庫,這個(gè)庫是符合lua的一些規(guī)范的(export具有一定特征的函數(shù)接口),lua先已動(dòng)態(tài)的方式加載該c庫,然后在庫中查找并調(diào)用相應(yīng)名字的接口,例如:luaopen_hello_world
                   e.已第一個(gè)"."為分割,將模塊名劃分為:(main, sub)的形式,根據(jù)package.cpath查找main,如果存在,就加載該庫并查詢相應(yīng)的接口:luaopen_main_sub,例如:先查找 hello庫,并查詢luaopen_hello_world接口
                   f.得到loder后,用modname作為唯一的參數(shù)調(diào)用該loader函數(shù)。當(dāng)然參數(shù)是通過lua的棧傳遞的,所以loader的原型必須符合lua的規(guī)范:int LUA_FUNC(lua_State *L)
                     
                   ll_require會(huì)將這個(gè)loader的返回值符給package.loaded[modelname],如果loader不返回值同時(shí) package.loaded[modelname]不存在時(shí), ll_require就會(huì)把package.loaded[modelname]設(shè)為true。最后ll_reuqire把package.loaded [modelname]返回給調(diào)用者。
                

            3.module的處理流程
                module(name, cb1, cb2, ...)
                
                a.如果package.loaded[name]是一個(gè)table,那么就把這個(gè)table作為一個(gè)mod
                b.如果全局變量name是一個(gè)table,就把這個(gè)全局變量作為一個(gè)mod
                c.創(chuàng)建table:t = {[name]=package.loaded[name], ["_NAME"]=name, ["_M"]=t, ["_PACKAGE"]=*name*(刪除了最后的".XXXX"部分)}. 如果name是一個(gè)以點(diǎn)分割的串,那么得到的mod類似這個(gè)樣子:
                  hello.world==> {["hello"]={["world"]={XXXXXXX}}}
                d.依次調(diào)用cbs:
                  cb1(mod), cb2(mod),...
                  
                e.將當(dāng)前模塊的環(huán)境設(shè)置為mod,同時(shí)把package.loaded[name] = mod    
                

              清楚了lua關(guān)于模塊的處理,就比較容易理解寫lua擴(kuò)展的細(xì)節(jié)了^_^。

            posted @ 2014-08-21 17:08 多彩人生 閱讀(362) | 評(píng)論 (0)編輯 收藏

            cocos2dx3.2

            新建項(xiàng)目
            cocos new

            編譯so文件
            cocos compile -p android

            posted @ 2014-08-20 21:45 多彩人生 閱讀(239) | 評(píng)論 (0)編輯 收藏

            lua學(xué)習(xí)

            ----------------------------------------------------------------------------------

            頭文件lua.h定義了Lua提供的基礎(chǔ)函數(shù)。其中包括創(chuàng)建一個(gè)新的Lua環(huán)境的函數(shù)(如lua_open),調(diào)用 Lua函數(shù)(如lua_pcall)的函數(shù),讀取/寫入Lua環(huán)境的全局變量的函數(shù),注冊(cè)可以被Lua代碼調(diào)用的新函數(shù)的函數(shù),等等。所有在lua.h中 被定義的都有一個(gè)lua_前綴。

            頭文件lauxlib.h定義了輔助庫(auxlib)提供的函數(shù)。同樣,所有在其中定義的函數(shù)等都以luaL_打頭(例如,luaL_loadbuffer)。輔助庫利用lua.h中提供的基礎(chǔ)函數(shù)提供了更高層次上的抽象;所有Lua標(biāo)準(zhǔn)庫都使用了auxlib。


            ----------------------------------------------------------------------------------

            在控制臺(tái) 使用 require 老是失敗

            后來發(fā)現(xiàn)要修改一下 package.path

            require搜索模塊時(shí)是根據(jù)package.path設(shè)的路徑來搜索的


            require搜索路徑

            package.path   -- lua模塊路徑

            package.cpath    -- dll so 庫路徑


            package.path = package.path..';d:\?.lua'


            // require mylua.lua

            require 'mylua' 


            ------------------------------------------------------------------------------------

            posted @ 2014-08-08 17:01 多彩人生 閱讀(354) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共25頁: 1 2 3 4 5 6 7 8 9 Last 

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            无码日韩人妻精品久久蜜桃| 久久亚洲AV成人出白浆无码国产| 国产高清国内精品福利99久久| 国产成人AV综合久久| 久久久久久av无码免费看大片| 久久人人爽人人爽人人av东京热| 蜜臀久久99精品久久久久久小说| 久久se这里只有精品| 亚洲AV无一区二区三区久久| 国产高潮久久免费观看| 日本人妻丰满熟妇久久久久久| 久久人妻少妇嫩草AV无码蜜桃| 久久精品国产亚洲av麻豆色欲| 性做久久久久久久久久久| 久久综合中文字幕| 精品久久久无码人妻中文字幕豆芽| 久久人人爽人人爽AV片| 久久婷婷国产麻豆91天堂| 一本久久知道综合久久| 久久久久久久91精品免费观看 | 一本色道久久99一综合| 国产精品美女久久久网AV| 色综合久久无码中文字幕| 久久综合狠狠综合久久97色| 久久综合欧美成人| 97久久久久人妻精品专区| 久久久老熟女一区二区三区| 欧美精品国产综合久久| 尹人香蕉久久99天天拍| 欧美日韩成人精品久久久免费看| yellow中文字幕久久网| 久久被窝电影亚洲爽爽爽| 99久久精品国产高清一区二区| 久久久久99精品成人片欧美| 色婷婷综合久久久久中文| 亚洲综合伊人久久综合| 久久亚洲精品无码aⅴ大香| 麻豆av久久av盛宴av| 精品乱码久久久久久久| 久久久久久狠狠丁香| 99久久亚洲综合精品成人|