• <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>
            foxriver
            Keep It Simple and Stupid.
            posts - 12,  comments - 39,  trackbacks - 0

            可以根據函數名進行排序,分類統計每個函數占用的代碼量,把結果導出到Excel/HTML,查詢奔潰地址。
            簡陋習作,目前只測試了VC6.0(個人比較守舊), 歡迎用過其他vc版本的同學反饋,以便改進。



            點我下載(300K) (更新1.1版本,支持文件拖移操作,修復字符過長BUG) 感謝Randy提供調試文本!

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

            文件拖進窗體WIN32API實現筆記:

            1. 加入頭文件#include <shellapi.h>//DragAcceptFiles
            2. 修改CreateWindowEx里的exsytle, 添加屬性值WS_EX_ACCEPTFILES
            3. 最后消息循環里加入處理函數

              case WM_DROPFILES:
               {
                HDROP hDrop = (HDROP)wParam;

                char buf[MAX_PATH];
                for(int i=0; DragQueryFile(hDrop, i, buf, MAX_PATH); i++)
                {
            //     MessageBox(0, buf, "Dropped File", MB_ICONINFORMATION); //此處處理文件,gbk編碼文件名
                }

                DragFinish(hDrop);// 一定別忘了這句,否則會有內存泄露。
               }
               return 0;

            posted @ 2009-03-13 18:23 foxriver 閱讀(6775) | 評論 (10)編輯 收藏

            1. 浮點數正確的累加方法。

            運行下述代碼段:

            double value = 99999999.99;
            double sum   = 0.0;
            for(int i=0;i<8192;i++)
            {
              sum += value; // 錯誤的浮點累加方法
            }

            printf("%18.2lf", sum); // 819199999918.02  --wrong

            運行結果,sum是錯誤的, 和正確值相差0.06(99999999.99 * 8192 = 819199999918.08),對于報表之類的高精度的項目數據統計,這是不能容忍的,循環越多誤差越大。解決方法之一,可以用高精度算法庫來代替,比如doubledouble類型,或選擇微軟的解決方法:本意是,浮點相加硬件實現是減法。把加法改成減法,把誤差也計算進去。

            上述代碼修改后:

            double value = 99999999.99;
            double sum   = 0.0;
            double C=0, Y, T;
            for(int i=0;i<8192;i++)
            {
              Y = value - C;
              T = sum + Y;
              C = T - sum - Y; // 正確的浮點累加方法,做減法。
              sum = T;
            }
            printf("%18.2lf", sum);// 819199999918.08  --correct

            加了誤差累計,這樣結果就正確了。還有浮點運算法則最重要一點,是不符合實數算法相同的代數規則。 (sum+Y)-sum-Y ,結果是不等于零的。

            參考:

            http://blog.csdn.net/l1t/archive/2004/10/01/122777.aspx
            http://msdn.microsoft.com/en-us/library/aa289157(VS.71).aspx

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

            2. 轉義符和字符串分離。

            char* aaa1 = "e:\\12\xB2\xE2""file.txt";
            char* aaa2 = "e:\\12\xB2\xE2file.txt";     // 編譯失敗, 0xE2File被識別為大字符進行轉意。

            切忌轉義符后直接跟字符串,這種錯誤有時候編譯器通過,但結果出錯,很難查。


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

            3. 繪制unicode的surrogate pair

            用TextOut可以繪制出來,直接用GetGlyphOutline會失敗,以下是通過TTF文件的筆劃ID號,來繪制UCS-4的方法。

            3.1 在ttf文件里,尋找代碼的筆劃ID:

            uint glyphid_code = 0;

            uint n;
            for (n=0; n<nGroups; n++)
            {
             uint  startCharCode = vfile.getBigEndianInt();
             uint  endCharCode   = vfile.getBigEndianInt();
             uint  startGlyphID  = vfile.getBigEndianInt();

             uint code;
             for (code = startCharCode; code <= endCharCode; code++)
             {
              uint w1 = 0;
              uint w2 = 0;

              // http://en.wikipedia.org/wiki/UTF-16/UCS-2
              if (code > 0x10000)
              {
               uint v = code;
               uint v1 = v - 0x10000;
               uint vh = v1 >> 10;
               uint vl = v1 & 0x3FF;
                    w1 = 0xD800 + vh;
                    w2 = 0xDC00 + vl;
              }

              if (w1 == 0xD842 && w2 == 0xDF9F)
               glyphid_code = (code - startCharCode) + startGlyphID;
             }
            }

            3.2. 用筆劃ID(glyphid_code)來直接繪制UCS-4文字.
            ---------------------

            // must use GGO_GLYPH_INDEX
            DWORD bufsize = GetGlyphOutline(hdc, glyphid_code, GGO_NATIVE|GGO_GLYPH_INDEX, &gm, 0, 0, &mat);
            if (bufsize == 0 || bufsize == GDI_ERROR)
            {
             DWORD err = GetLastError();
             continue;
            }

            byte* bufdata = new byte[bufsize];
            if (GetGlyphOutline(hdc, r_glyphid_code, GGO_NATIVE|GGO_GLYPH_INDEX, &gm, bufsize, bufdata, &mat) == GDI_ERROR)
            {
             delete[] bufdata;
            }

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

            4. 代碼優化:

            1. 在成員函數里,使用靜態數組,避免每次都需要初始化。
            2. 在IF判斷時,使用likely/unlikely。
            3. 減少malloc調用消耗,特別是算法循環中(比如RSA大數算法),使用stack代替。

            ------------------------------------------------------------
            在VC里整合使用intel c compiler的好處:

            1. 檢查std::string str; printf("%s", str); 此類的致命錯誤;// non-POD (Plain Old Data) class type passed through ellipsis
            2. 使用OpenMP優化代碼

            ------------------------------------------------------------
            性能:

            1. 圖片內存隨機訪問,在release模式下,data[y][x]二維數組訪問和data[y*width+x]一維數組是一樣快的,編譯器會自動優化乘法。




             

            posted @ 2009-02-28 06:33 foxriver 閱讀(1838) | 評論 (0)編輯 收藏
            僅列出標題
            共2頁: 1 2 

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(3)

            隨筆檔案

            文章檔案

            相冊

            1

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            精品久久久久国产免费| 日本亚洲色大成网站WWW久久| 久久人人爽人爽人人爽av| 久久av高潮av无码av喷吹| 久久精品国产99久久香蕉| 亚洲精品tv久久久久| 久久精品国产日本波多野结衣| AV无码久久久久不卡蜜桃| 99re久久精品国产首页2020| 岛国搬运www久久| 久久亚洲高清综合| 久久人爽人人爽人人片AV| 精品久久人人妻人人做精品| 久久久久久青草大香综合精品| 国内精品综合久久久40p| 欧美日韩中文字幕久久伊人| 思思久久99热免费精品6| 日产精品久久久久久久性色| 国产精品九九久久免费视频| 色播久久人人爽人人爽人人片AV| 99re久久精品国产首页2020| 久久综合九色综合久99| 久久香蕉国产线看观看精品yw | 97精品国产97久久久久久免费 | 欧美久久久久久精选9999| 久久丫忘忧草产品| 久久精品国产亚洲网站| 久久毛片一区二区| 国产午夜福利精品久久| 久久久一本精品99久久精品66| 老司机午夜网站国内精品久久久久久久久| 伊人久久亚洲综合影院| 国产精品丝袜久久久久久不卡| 久久久久亚洲AV成人网人人网站| 久久国产精品免费一区| 72种姿势欧美久久久久大黄蕉| 亚洲综合日韩久久成人AV| 伊人伊成久久人综合网777| 久久久久国产| 久久精品女人天堂AV麻| 久久精品国产99久久香蕉|