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

            Error

            C++博客 首頁 新隨筆 聯系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

            #

            查看和設置ndk使用的gcc版本
            設置toolchain的方法是在Application.mk中設置:
            NDK_TOOLCHAIN_VERSION = 4.7
            為了確認是否設置成功,在ndk-build調用時增加參數V=1。即 ndk-build V=1 ..其他參數..
            結果會顯示:
            /Developer/sdks/Android-ndk-r8e/toolchains/arm-Linux-androideabi-4.7/prebuilt/darwin-x86_64/bin/arm-Linux-androideabi-g++ -MMD -MP -MF ....
            posted @ 2017-03-31 19:32 Enic 閱讀(713) | 評論 (0)編輯 收藏

            // lambda_test.cpp : Defines the entry point for the console application.
            //
            #include "stdafx.h"
            #include <iostream>
            #include <functional>
            // 利用rtii觀察堆棧生命周期
            class StackLifeTimeWatching
            {
            public:
            StackLifeTimeWatching()
            {
            std::cout << __FUNCTION__ << std::endl;
            }
            ~StackLifeTimeWatching()
            {
            std::cout << __FUNCTION__ << std::endl;
            }
            };
            // 經驗: 保存lambda表達式的變量被銷毀后,該表達式對應的閉包會銷毀。應該保證閉包在lambda表達式變量的生命周期之內執行,否則程序執行結果不可預知!
            // 1.理解lambda首先要理解函數對象,和閉包
            // 2.理解必包的基礎上,理解lambda如何實現閉包
            // 3.理解閉包以后,需要分析設置不同的capture的情況下分別是如何實現閉包
            //   1)閉包意味著一個函數地址 + 一組封裝好的參數。
            //   2)閉包可以被拷貝,但是每個閉包中的參數可以是不一樣的
            // 4.理解函數對象和lambda的關系: lambda可以理解成函數,但是當lambda賦值給一個函數對象的時候,編譯器應該是把lambda構造成了一個閉包的function
            //   1)根據匯編碼分析,lambda對象類似于函數指針(但是類型系統和函數指針是完全不同的概念,可以用decltype(lambda)來鑒定),本質和函數對象是不一樣的。
            //   2)定義一個lambda表達式相當于定義一個函數(觀察會變碼,lambda表達式是沒有構造和析構的)
            //   3)把函數指針賦值給一個std::function,和吧lambda賦值給一個std::function的效果是完全不一樣的。一個這是指針賦值操作,另一個則是完整的閉包。
            //   4)經過代碼實際測試,lambda是鑒于函數指針和函數對象之間的一個玩意,它也是一個特殊的類型,這個具體只能看C++標準文檔了。
            //   5)boost asio異步接口中的functor可能是利用了meta編程技巧,或者他本身每一次發起異步操作都會形成一個獨立的閉包,解決了函數對象和socket對象生命周期綁定的關系
            //      應為如果是functor實現,宿主對象析構,一定會造成作為成員變量的functor銷毀,同時引起lambda閉包混亂(不僅閉包參數亂掉,閉包函數本身也呈現混亂)。
            //      由此分析,閉包中的任何一行代碼都必須在閉包本身的聲明周期內執行。似乎可以理解成,lambda閉包是把lambda函數本身也當作一個特殊的參數來完成閉包封裝的。
            //      通過會變碼觀察,在使用不同的lambda變量調用lambda表達式的時候,會在ecx寄存器壓入不同的值,然后會讀取一塊關聯的內存。
            //   6)vc2015下的lambda永遠都是4字節,這應該是編譯器實現細節了,按說應該是隨著閉包內容的大小變化而變化。我猜測,這四個字節應該指向一個塊內存,里邊的數據是用來還原“lambda”函數執行棧的閉包
            // 5.通俗的理解上述分析: lambda對象(變量)是一塊內存,內存里邊是lambda表達式本身的副本。當執行lambda表達式對象的時候,實際是執行對象對應的內存中的代碼,如果對象被析構了,對應的代碼也就是未知代碼。
            void Test1();
            void Test2();
            int main()
            {
            Test2();
                return 0;
            }
            void Test2()
            {
            int n = 0;
            auto lambda = [&]()->void
            {
            StackLifeTimeWatching stackWatching;
            n = 1;
            int j = 0;
            int j1 = 0;
            int j2 = 0;
            int j3 = 0;
            int j4 = 0;
            int j5 = 0;
            };
            decltype(&lambda) pLambda0 = &lambda;
            decltype(&lambda) pLambda = NULL;
            int nSize = sizeof(lambda);
            {
            decltype(lambda) lambda_copy = lambda;
            lambda_copy();
            }
            (*pLambda0)();  // 正常掉用
            (*pLambda)();  // 調用后整個閉包混亂
            }
            void Test1()
            {
            StackLifeTimeWatching p();
            int n = 0;
            std::function<void()> func;
            std::function<void()>* pFunc = new std::function<void()>;
            {
            //std::function<void()> func = [&]()->void
            //{
            // StackLifeTimeWatching stackWatching;
            // n = 1;
            //};
            //func();
            auto lambda = [&]()->void
            {
            StackLifeTimeWatching stackWatching;
            n = 1;
            };
            lambda();
            func = lambda;
            auto lambda2 = [&]()->void
            {
            delete pFunc;
            pFunc = NULL;
            StackLifeTimeWatching stackWatching;
            n = 1;
            };
            //decltype(lambda) lambda_copy = lambda2; 編譯錯誤,應為編譯器會把每一個lambda表達式當作一個獨立的類型,這是lambda不同于函數指針的地方,函數指針是根據參數來決定類型的
            decltype(lambda) lambda_copy = lambda;
            *pFunc = lambda2;
            }
            func();
            (*pFunc)();
            }
            posted @ 2017-03-22 22:41 Enic 閱讀(1848) | 評論 (0)編輯 收藏

            實現在CCGeometry.js
            Point:
            type: cc.Point(x,y)
            help functon: 
            cc.p(x,y)
            cc.pointEqualToPoint(p1, p2)
            cc.Size()
            cc.size();
            cc.sizeEqualToSize
            cc.Rect()
            cc.rect()
            cc.rectEqualToRect()
            cc._rectEqualToZero()
            cc.rectContainsRect()
            cc.rectGetMaxX
            cc.rectGetMidX
            cc.rectGetMinX
            cc.rectGetMaxY
            cc.rectGetMidY
            cc.rectGetMinY
            cc.rectContainsPoint
            cc.rectIntersertsRect
            cc.rectOverlapsRect
            cc.rectUnion
            cc.rectInterserction
            // 可視區域
            cc.visibleRect()


            經過實際調試:
            Point: 有x y屬性可以直接使用
            Size: width height
            Rect: x y width height
            posted @ 2017-03-19 10:54 Enic 閱讀(162) | 評論 (0)編輯 收藏

            1.創建的時候給明確地址和端口,創建完成后直接可以accept
            2.open bind listen accept完整套路
            posted @ 2017-03-16 21:56 Enic 閱讀(179) | 評論 (0)編輯 收藏

            1.直接close:客戶端接收數據不完整,本地系統關閉socket,客戶端收不到完整數據
            2.shutdown_both:客戶端接收數據不完整,end of file
            3.shutdown_receive: 客戶端接收數據完整
            3.shutdown_send: 客戶端接收數據不完整,遠程主機關閉鏈接
            關閉socket,但是確保對端一定收到數據的手段是:
            1.shutdown_receive,同時在應用層確認全部數據已經投遞到tcp堆棧,然后調用close
            2.設計應用層關閉協議,由接收方主動關閉
            posted @ 2017-03-16 21:54 Enic 閱讀(576) | 評論 (0)編輯 收藏

            apt-get install mysql-server
            apt-get install apache2
            apt-get install php5
            apt-get install php5-mysql
            apt-get install php5-gd
            apt-search php5
            apt-get install libapache2-mod-php5.6
            apt-get install libapache2-mod-auth-mysql
            apt-get install openjdk
            sudo apt-get purge openjdk/openjdk
            apt-get install python-software-properties
            apt-get install software-properties-common
            apt-get install -y language-pack-en-base
            LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php
            add-apt-repository ppa:ondrej/php
            apt-get update
            apt-cache search php5
            apt-get install php5.5-common
            apt-get install libapache2-mod-php5.5
            apt-get install php5.6
            apt-get install php5.6-mysql
            apt-get install php5.6-gd
            apt-get install php7.1-mcrypt
            apt-get install php-mbstring
            apt-get install php7.1-mbstring
            lsof -i:80   權限查詢
            /etc/init.d/apache2 restart
            netstat -tupln
            /etc/apache2/ports.conf
            vi /etc/apache2/sites-enabled/000-default.conf  修改默認站點的root路徑
            sudo apt-get install phpmyadmin
            ln -s /usr/share/phpmyadmin
            sudo apt-get install wordpress
            ln -s /usr/share/wordpress
            cp wp-config-sample.php wp-config.php
            vi wp-config.php
            mysql: create database WordPress
            ls /usr/share
            ls /var/www/
            WordPress
            posted @ 2017-03-10 14:13 Enic 閱讀(127) | 評論 (0)編輯 收藏

            // RandomTest.cpp : Defines the entry point for the console application.
            //

            #include "stdafx.h"

            #include <iostream>
            #include <cmath>
            #include <random>
            #include <cstdint>
            #include <ctime>
            #include <algorithm>
            #include <numeric>
            #include <cassert>
            #include <climits>
            #include <thread>

            #define XASSERT(exp) assert(exp)
            #define XASSERT_MSG(exp, msg) assert(exp)
            #define X_DEFAULT_FLOAT_PRECISION (0.00000001)

            // @in: 總次數、目標比例(千分比)、算法類型(1.c標準庫rand; 2.cpp11 mt19937)
            // @out: 實際命中次數、實際命中概率
            bool RandomHitTest(int32_t nTotalCount, float fHitRate, int32_t nAlgorithmType, int32_t& nRealHitCount, float& fRealHitRate);
            void RandomHitTest_std_mt19937(int32_t nTotalCount, float fHitRate, int32_t& nRealHitCount, float& fRealHitRate);
            void RandomHitTest_std_rand(int32_t nTotalCount, float fHitRate, int32_t& nRealHitCount, float& fRealHitRate);
            // 簡化std::rand獲取[nMin, nMax]區間的一個數字
            uint32_t StdRandEx(uint32_t nMin, uint32_t nMax);


            int _tmain(int argc, _TCHAR* argv[])
            {
                //std::thread srandThread([](){ std::this_thread::sleep_for(std::chrono::seconds(1));});
                
            //srandThread.detach();

                std::vector<std::tuple<floatfloat>> vecResult;

                for (int n = 0; n < 1000; n++)
                {
                    uint32_t nTotalCount = 100000;  // 基數100000次

                    for (float fHitRate = 0.001f; 1.f - fHitRate >= 0; fHitRate = fHitRate + 0.101f)
                    {
                        int32_t nRealHitCount = 0;
                        float fRealHitRate = 0;

                        // std::rand測試
                        RandomHitTest(nTotalCount, fHitRate, 1, nRealHitCount, fRealHitRate);
                        //std::cout << "AlgorithmType=" << 1 << ",TotlaCount=" << nTotalCount << ",HitRate=" << 
                        
            //    fHitRate  << ",ReahHitRate=" << std::fixed << fRealHitRate << ",RealHitCount=" << nRealHitCount << std::endl;


                        int32_t nRealHitCount1 = 0;
                        float fRealHitRate1 = 0;

                        // cpp11 mt19937
                        RandomHitTest(nTotalCount, fHitRate, 2, nRealHitCount1, fRealHitRate1);
                        //std::cout << "AlgorithmType=" << 2 << ",TotlaCount=" << nTotalCount << ",HitRate=" << 
                        
            //    fHitRate  << ",ReahHitRate=" << std::fixed << fRealHitRate1 << ",RealHitCount=" << nRealHitCount1 << std::endl;
                        
            //std::cout << "---differ rate=" << std::fixed << fRealHitRate1 - fRealHitRate << ", differ count=" 
                        
            //    << nRealHitCount1 - nRealHitCount << std::endl;

                        std::tuple<floatfloat> tupleResult = std::make_tuple(fHitRate, std::fabsf(fRealHitRate1 - fRealHitRate));
                        vecResult.push_back(tupleResult);
                    }
                }

                std::sort(vecResult.begin(), vecResult.end(), 
                    [](std::tuple<floatfloat>& tupLeft, std::tuple<floatfloat>& tupRight)->bool{
                        //float fHitRateL = 0;
                        
            //float fRealRateL = 0;

                        
            //float fHitRateR = 0;
                        
            //float fRealRateR = 0;
                        return std::get<1>(tupLeft) - std::get<1>(tupRight) > 0;;
                });

                auto tupleFirst = vecResult[0];

                return 0;
            }


            uint32_t StdRandEx(uint32_t nMin, uint32_t nMax)
            {
                XASSERT((nMin >= 0) && (nMax >= 0) && (nMin <= nMax));

                uint32_t nRandVal = 0;

                if (nMin == nMax)
                {
                    nRandVal = nMax;
                }
                else if (nMin < nMax)
                {
                    nRandVal = rand() % (nMax - nMin + 1) + nMin;
                }
                else
                {
                    XASSERT_MSG(0, _T("參數異常"));
                }

                return nRandVal;
            }

            void RandomHitTest_std_rand(int32_t nTotalCount, float fHitRate, int32_t& nRealHitCount, float& fRealHitRate)
            {
                nRealHitCount = 0;
                fRealHitRate = 0;

                if (nTotalCount <= 0 || fHitRate <= 0)
                {
                    return;
                }

                // 計算浮點小數點個數
                int32_t nWeCount = 3;  // 位數(三位數,千分比精度)
                XASSERT((fHitRate * std::pow(10, nWeCount)) - std::numeric_limits<uint64_t>::max() <= X_DEFAULT_FLOAT_PRECISION);  // 永不溢出
                int64_t nHitRateIntHelp = static_cast<uint64_t>(fHitRate * std::pow(10, nWeCount));  // 概率轉整數輔助計算

                
            // 根據位數決定隨機數范圍
                int32_t nRandMin = 0;
                int32_t nRandMax = std::pow(10, nWeCount);

                // 開始測試
                auto nTestCount = nTotalCount;
                while (nTestCount-- > 0)
                {
                    // 生成隨機數
                    int32_t nRandVal = StdRandEx(nRandMin, nRandMax);

                    // 命中判定
                    if (nRandVal < nHitRateIntHelp)
                    {
                        nRealHitCount++;
                    }
                }

                fRealHitRate = float(nRealHitCount)/float(nTotalCount);
            }

            void RandomHitTest_std_mt19937(int32_t nTotalCount, float fHitRate, int32_t& nRealHitCount, float& fRealHitRate)
            {
                nRealHitCount = 0;
                fRealHitRate = 0;

                if (nTotalCount <= 0 || fHitRate <= 0)
                {
                    return;
                }

                // 計算浮點小數點個數
                int32_t nWeCount = 3;  // 位數(三位數,千分比精度)
                XASSERT((fHitRate * std::pow(10, nWeCount)) - std::numeric_limits<uint64_t>::max() <= X_DEFAULT_FLOAT_PRECISION);  // 永不溢出
                int64_t nHitRateIntHelp = static_cast<uint64_t>(fHitRate * std::pow(10, nWeCount));  // 概率轉整數輔助計算

                
            // 根據位數決定隨機數范圍
                int32_t nRandMin = 0;
                int32_t nRandMax = std::pow(10, nWeCount);

                // 設置隨機數生成器
                std::random_device rd;
                std::mt19937_64 gen(rd());
                std::uniform_int_distribution<> dis(nRandMin, nRandMax);
                
                // 重設種子應該使用這個api:::CryptGenRandom
                
            // linux也有相應的高精度隨機數
                gen.seed(uint32_t(time(NULL)));

                // 開始命中測試
                auto nTestCount = nTotalCount;
                while (nTestCount-- > 0)
                {
                    // 生成隨機數
                    uint32_t randVal = dis(gen);

                    if (randVal < nHitRateIntHelp)
                    {
                        nRealHitCount++;
                    }
                }

                fRealHitRate = float(nRealHitCount)/float(nTotalCount);
            }


            bool RandomHitTest(int32_t nTotalCount, float fHitRate, int32_t nAlgorithmType, int32_t& nRealHitCount, float& fRealHitRate)
            {
                if (nTotalCount <= 0)
                {
                    return false;
                }

                bool bRet = true;
                switch (nAlgorithmType)
                {
                case 1:
                    RandomHitTest_std_rand(nTotalCount, fHitRate, nRealHitCount, fRealHitRate);
                    break;
                case 2:
                    RandomHitTest_std_mt19937(nTotalCount, fHitRate, nRealHitCount, fRealHitRate);
                    break;
                default:
                    bRet = false;
                    break;
                }

                return true;
            }

            posted @ 2017-01-22 12:28 Enic 閱讀(1327) | 評論 (0)編輯 收藏

            參考鏈接:http://www.cnblogs.com/dolphinX/p/3269145.html
            最基礎的玩法:

            var Plaza = {};
            Plaza.HelloWorldLayer = cc.Layer

            這樣解決不了多個文件中需要使用同一個名字控件而且需要共享的情況。


            var Plaza = Plaza || {};
            Plaza.HelloWorldLayer = cc.Layer
            這樣簡單處理能搞定。

            另外還有如下比較高階的函數玩法:

            (function(){                 
               var _NS=function(){ }
               _NS.prototype.alert
            =function(){
                  console.log(
            'test');
            }
            window.NS
            =new _NS();
            })();
            posted @ 2016-12-21 10:15 Enic 閱讀(120) | 評論 (0)編輯 收藏

            bSceneCutsomResolution決定適配策略ResolutionPolicy::EXACT_FIT會用縮放拉伸的方式適配

            void
             CAutoScreen::SetSceneResolute(float w, float h, bool bSceneCutsomResolution)
            {
                CAutoScreen::sceneCutsomResolution=bSceneCutsomResolution;

                if(bSceneCutsomResolution)
                {
                    cocos2d::Size ls = Size(w, h);
                    Size fs = Director::getInstance()->getOpenGLView()->getFrameSize();
                    float sx = ls.width/fs.width;
                    float sy = ls.height/fs.height;
                
                    sceneResolute = ls;
                
                    //定義 scale 變量
                    resoluteBool = sx>sy;
                    float scale = resoluteBool?sx:sy;
                    SetSceneSize(resoluteBool?ls.width:fs.width*scale, resoluteBool?fs.height*scale:ls.height);
                    SetSceneScale(resoluteBool?fs.height*scale/ls.height : fs.width*scale/ls.width);
                
                    Director::getInstance()->getOpenGLView()->setDesignResolutionSize(GetSceneWidth(), GetSceneHeight(), ResolutionPolicy::SHOW_ALL);
                }
                else
                {
                    sceneScale = 0.0f;
                    sceneSize = Size(w, h);
                    sceneResolute = Size(w, h);
                    Director::getInstance()->getOpenGLView()->setDesignResolutionSize(w, h, ResolutionPolicy::EXACT_FIT);
                }
                Director::getInstance()->setContentScaleFactor(1.0f);
            }
            posted @ 2016-12-19 18:07 Enic 閱讀(221) | 評論 (0)編輯 收藏

            1.暴力做法:
            select * into [QPTreasureDB].dbo.[WinLoseScoreInfo2] from [QPTreasureDB].dbo.[WinLoseScoreInfo]
            drop table [WinLoseScoreInfo]
            select distinct * into [QPTreasureDB].dbo.[WinLoseScoreInfo] from [WinLoseScoreInfo2]

            2.如果表中有id字段可以考慮:先根據指定字段查詢重復數據,然后根據不為已的id設置保留數據
            select UserId, ServerId, DateId, count(*) as [count], @@rowid--, ROW_NUMBER()over(order by UserId, ServerId, DateId) 
            from QPTreasureDB.dbo.WinLoseScoreInfo 
            group by UserId, ServerId, DateId 
            having count(*) > 1;
            posted @ 2016-12-19 13:58 Enic 閱讀(110) | 評論 (0)編輯 收藏

            僅列出標題
            共22頁: 1 2 3 4 5 6 7 8 9 Last 
            无码乱码观看精品久久| 亚洲国产精品狼友中文久久久| 欧美麻豆久久久久久中文| 久久精品一区二区国产| 亚洲国产精品久久久久婷婷老年 | 久久99国产精一区二区三区 | 国产亚洲欧美精品久久久| 久久99精品久久久久久| 精品人妻伦九区久久AAA片69 | 欧美亚洲另类久久综合| 97精品伊人久久大香线蕉| 狠狠色伊人久久精品综合网| 精品无码人妻久久久久久| 久久精品国产第一区二区三区| 国产成人精品久久一区二区三区| 久久久久亚洲精品天堂久久久久久| 久久久久99精品成人片牛牛影视| 久久线看观看精品香蕉国产| 亚洲国产视频久久| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 一本久久精品一区二区| 亚洲午夜久久影院| 久久国产精品无码HDAV| 无码任你躁久久久久久老妇App| 久久午夜电影网| 久久婷婷国产麻豆91天堂| 国产精品久久久久jk制服| 欧美喷潮久久久XXXXx| 91精品国产乱码久久久久久| 99re这里只有精品热久久| 国内精品伊人久久久久AV影院| 久久精品中文字幕久久| 国产精品成人无码久久久久久| 66精品综合久久久久久久| 99久久免费国产特黄| 国产高清美女一级a毛片久久w| 94久久国产乱子伦精品免费| 伊人情人综合成人久久网小说| 香蕉久久夜色精品升级完成 | 亚洲成色999久久网站| 久久se精品一区二区影院|