• <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>

            李錦俊(mybios)的blog

            游戲開發 C++ Cocos2d-x OpenGL DirectX 數學 計算機圖形學 SQL Server

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              86 Posts :: 0 Stories :: 370 Comments :: 0 Trackbacks

            公告

            QQ:30743734
            EMain:mybios@qq.com

            常用鏈接

            留言簿(16)

            我參與的團隊

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 370171
            • 排名 - 67

            最新評論

            閱讀排行榜

            評論排行榜

            我在嘗試導出Ogre的所有類接口到lua中使用,參考CEGUI的方法,使用的是tolua++來導出C++類對象。在使用過程中,遇到了一些問題。


            問題1:
            表現為tolua++編譯錯誤,錯誤信息是:***curr code for error is $pfile "OgreBase/OgreVector2.h"

            這里我編寫了一個OgreBase.pkg文件(給tolua++用來生成導出導入lua的定義文件)
            namespace Ogre
            {
                $pfile 
            "OgreBase/OgreSharedPtr.h" 
                $pfile 
            "OgreBase/OgreVector2.h" 
            }
            ;
            OgreSharedPtr.h文件內容如下:
            $#include "OgreSharedPtr.h"
            /// The method to use to free memory on destruction
            enum SharedPtrFreeMethod
            {
                
            /// Use OGRE_DELETE to free the memory
                SPFM_DELETE,
                
            /// Use OGRE_DELETE_T to free (only MEMCATEGORY_GENERAL supported)
                SPFM_DELETE_T,
                
            /// Use OGRE_FREE to free (only MEMCATEGORY_GENERAL supported)
                SPFM_FREE
            }
            ;

            class SharedPtr
            {
                TOLUA_TEMPLATE_BIND(T, Ogre::DataStream , Ogre::DataStreamList , Ogre::StringVector , Ogre::FileInfoList)

                SharedPtr();
                
            ~SharedPtr();
                T
            * get() ;
                
            void bind(T* rep, SharedPtrFreeMethod freeMethod = SPFM_DELETE);
                
            bool unique() ;
                unsigned 
            int useCount() ;
                T
            * getPointer() ;
                
            bool isNull(void) ;
                
            void setNull(void);
            }
            ;
            OgreVector2.h內容如下:
            $#include "OgreVector2.h"


            class Vector2
            {
            public:
                Real x, y;

            public:
                inline Vector2();
                inline Vector2( Real fX,  Real fY );
                inline Vector2(  Vector2
            & rkVector );

                inline Real 
            operator [] (  size_t i ) ;

                inline Real
            & operator [] (  size_t i );
                inline Real
            * ptr();
                inline  Real
            * ptr() ;
                inline Vector2
            & operator = (  Vector2& rkVector );
                inline Vector2
            & operator = (  Real fScalar);

                inline 
            bool operator == (  Vector2& rkVector ) ;

                inline 
            bool operator != (  Vector2& rkVector ) ;
                inline Vector2 
            operator + (  Vector2& rkVector ) ;

                inline Vector2 
            operator - (  Vector2& rkVector ) ;
                inline Vector2 
            operator * (  Real fScalar ) ;

                inline Vector2 
            operator * (  Vector2& rhs) ;

                inline Vector2 
            operator / (  Real fScalar ) ;

                inline Vector2 
            operator / (  Vector2& rhs) ;

                inline  Vector2
            & operator + () ;

                inline Vector2 
            operator - () ;

                inline Real length () ;
                inline Real squaredLength () ;
                inline Real dotProduct( Vector2
            & vec) ;
                inline Real normalise();
                inline Vector2 midPoint(  Vector2
            & vec ) ;
                inline 
            bool operator < (  Vector2& rhs ) ;
                inline 
            bool operator > (  Vector2& rhs ) ;
                inline 
            void makeFloor(  Vector2& cmp );
                inline 
            void makeCeil(  Vector2& cmp );
                inline Vector2 perpendicular(
            void) ;
                inline Real crossProduct(  Vector2
            & rkVector ) ;
                inline Vector2 randomDeviant(
                    Real angle) ;
                inline 
            bool isZeroLength(void) ;
                inline Vector2 normalisedCopy(
            void) ;
                inline Vector2 reflect( Vector2
            & normal) ;
                
            // special points
                static const Vector2 ZERO;
                
            static const Vector2 UNIT_X;
                
            static const Vector2 UNIT_Y;
                
            static const Vector2 NEGATIVE_UNIT_X;
                
            static const Vector2 NEGATIVE_UNIT_Y;
                
            static const Vector2 UNIT_SCALE;

            }
            ;

            咋一看,沒任何問題,但是編譯卻錯誤。原因在于tolua++對$pfile的處理有些許問題,它是直接把被包含文件粘貼到一個文件中,而OgreSharedPtr.h最后一行是};,結果};和$pfile "OgreBase/OgreVector2.h"連在一行中了,結果出現編譯錯誤。解決辦法很簡單,在每行$pfile之后加一行空行,或者在每個被包含頭文件后保證最后一行是空行即可。


            問題2:
            tolua++對嵌套類模板的導出bug。編寫如下的pkg文件,為了導出一個有4個模板參數的std::map類到lua中,而4個模板參數中有個模板參數Ogre::STLAllocator帶有自身的模板參數嵌套,代碼如下:




            namespace Ogre
            {
                
            class STLAllocator
                
            {
                    TOLUA_TEMPLATE_BIND(T, 
            int , shortdouble, VECTOR3, std::string, IModelViewWrapper*, IDisplaySetting::Property, IDisplaySetting::DisplaySize, IDisplaySetting::AntiAliasingLevel, DataStreamPtr, Plane, PlaneBoundedVolume, Polygon*, std::pair<std::string Ogre::BaseResourceGroupManager::ArchiveIndexEntry>, std::pair<std::string Ogre::BaseResourceGroupManager::BaseResourceGroup*>, Ogre::BaseResourceGroupManager::ResourceLocation*)
                }
            ;
                
            }
            ;
            namespace std
            {
                
            class less
                
            {
                    TOLUA_TEMPLATE_BIND(T,std::
            string)
                }
            ;
                
                
            class pair
                
            {
                    TOLUA_TEMPLATE_BIND(F S,std::
            string Ogre::BaseResourceGroupManager::ArchiveIndexEntry)
                    pair();
                    
            ~pair();
                    F first;
                    S second;
                }
            ;
                
                
            class map 
                
            {
                    TOLUA_TEMPLATE_BIND(K V S A,std::
            string Ogre::BaseResourceGroupManager::ArchiveIndexEntry std::less<std::string> Ogre::STLAllocator<std::pair<std::string,Ogre::BaseResourceGroupManager::ArchiveIndexEntry> >)
                    
                    
            class iterator
                    
            {
                        pair
            <K,V> operator->();
                    }
            ;
                    
                    
            void clear();
                    
            bool empty();
                    
            int size() ;
                    
                    std::map
            <K,V,S,A>::iterator find( K &key);
                    std::map
            <K,V,S,A>::iterator begin();
                    std::map
            <K,V,S,A>::iterator end();
                    std::map
            <K,V,S,A>::reverse_iterator rbegin();
                    std::map
            <K,V,S,A>::reverse_iterator rend();
                    
                    std::pair
            <std::map<K,V,S,A>::iterator,bool> insert( std::pair<K,V> &value);
                    std::map
            <K,V,S,A>::iterator erase(std::map<K,V,S,A>::iterator iter);
                    
                    
                    map();
                    
            ~map();
                }
            ;

            }
            ;

            用tolua++編譯這個pkg文件,生成cpp文件時不會出錯,但編譯cpp文件時會出錯,因為它生成的cpp文件中,模板嵌套的代碼有問題,如下:

            生成的錯誤代碼片段1:
            std::map
            <std::string ,Ogre::BaseResourceGroupManager::ArchiveIndexEntry ,std::less<std::string> ,Ogre::STLAllocator<std::pair<std::string,Ogre::BaseResourceGroupManager::ArchiveIndexEntry> >>

            生成的錯誤代碼片段2:
            std::map
            <std::string ,Ogre::BaseResourceGroupManager::ArchiveIndexEntry ,std::less<std::string> ,Ogre::STLAllocator<std::pair<std::string,Ogre::BaseResourceGroupManager::ArchiveIndexEntry> >,>
            這兩段錯誤代碼中,第一個代碼片段最后兩個尖括號連接在一起了,錯誤在于最后兩個尖括號間沒有空格。
            第二個代碼片段最后兩個尖括號間多了個“,”符號。
            檢查發現,是tolua++代碼本身有bug,修復如下:
            打開tolua++目錄的lua目錄,打開class.lua文件,181行append = string.gsub(append, ">>", "> >"),這里目的是把兩個尖括號間加空格,但它沒考慮到把這個類型與另一個模板類型嵌套使用的情況,結果出現代碼片段1的bug,解決辦法是改成append = string.gsub(append, ">>", "> > "),即在最后一個尖括號后自動加一個空格,以解決此問題,187行也有同樣的問題,改成bI = string.gsub(bI, ">>", "> > ")即可。
            對于錯誤的代碼片段2,需要打開declaration.lua,定位到148行,改成local template_part = "<"..concat(m, 1, m.n , ",")..">",這樣就能解決代碼片段2的問題,此問題的起因在于此地方用空格來做模板參數的分隔符,但模板尖括號間又有空格,結果把這個空格自動替換成逗號,導致編譯錯誤。


            最后,由于Ogre庫比較龐大,暫時我只完成了Ogre基本庫(數學庫、字符串、文件系統等等渲染無關系統)的功能導出到lua,還沒把渲染層導出。


            如果本文對你的開發有所幫助,并且你手頭恰好有零錢。

            不如打賞我一杯咖啡,鼓勵我繼續分享優秀的文章。




            posted on 2010-02-09 19:43 李錦俊(mybios) 閱讀(7243) 評論(7)  編輯 收藏 引用 所屬分類: LUA

            Feedback

            # re: tolua++導出C++類的一些問題和解決方法 2010-02-10 09:38 akunspy
            沒這樣用lua的
            這需求本身就有問題...  回復  更多評論
              

            # re: tolua++導出C++類的一些問題和解決方法 2010-02-10 13:06 mybios
            @akunspy
            不吝賜教,請問這樣用lua有什么問題?  回復  更多評論
              

            # re: tolua++導出C++類的一些問題和解決方法 2010-02-13 17:11 陳梓瀚(vczh)
            從編譯器開發者的的角度上講,這樣沒問題  回復  更多評論
              

            # re: tolua++導出C++類的一些問題和解決方法 2011-01-05 13:01 libla
            這不過是把C++的皮換成lua而已,對于程序開發來說,除了降低執行效率,不會帶來其他好處,寫lua就和寫C++沒區別  回復  更多評論
              

            # re: tolua++導出C++類的一些問題和解決方法 2011-02-17 17:27 朱江波
            樓主這兩個問題我都碰到過,只是當時不求甚解,沒深究,避而不用。現在學習了,多謝樓主。  回復  更多評論
              

            # re: tolua++導出C++類的一些問題和解決方法 2015-04-04 22:09 周瑞
            非常感謝!!如果不看這篇文章的話,可能我一個月也找不出問題在哪兒  回復  更多評論
              

            # re: tolua++導出C++類的一些問題和解決方法 2016-03-18 17:51 play_with_wolf
            能否開源一下Ogre基本庫的pkg文件么  回復  更多評論
              

            香蕉aa三级久久毛片| 日本免费一区二区久久人人澡| 久久天天躁狠狠躁夜夜躁2O2O | 欧美伊香蕉久久综合类网站| 午夜欧美精品久久久久久久| 国产精品久久久久蜜芽| 久久综合亚洲色一区二区三区| 大香伊人久久精品一区二区| 18禁黄久久久AAA片| 久久久亚洲AV波多野结衣| 99精品国产99久久久久久97| 久久久噜噜噜久久中文字幕色伊伊 | 久久av免费天堂小草播放| 97精品国产97久久久久久免费| 国产一久久香蕉国产线看观看| 久久国产乱子伦精品免费强| 久久精品这里热有精品| 久久本道综合久久伊人| 中文字幕无码av激情不卡久久| 久久精品国产亚洲αv忘忧草| 一本色道久久HEZYO无码| 精品久久久久久中文字幕人妻最新| 欧美熟妇另类久久久久久不卡| 久久精品午夜一区二区福利| 66精品综合久久久久久久| 亚洲第一永久AV网站久久精品男人的天堂AV | 精品久久久一二三区| 久久伊人精品一区二区三区| 午夜精品久久久久久久久| 97久久香蕉国产线看观看| 久久精品一区二区影院| 中文精品久久久久人妻不卡| 国产精品久久久久久吹潮| 久久国产视频网| 久久受www免费人成_看片中文| 亚洲精品乱码久久久久久按摩| 久久国产精品99精品国产987| 亚洲欧洲久久av| 久久se精品一区二区| 久久精品国产免费观看| 国产精品美女久久久免费|