顯示具有 [程式]C++ 標籤的文章。 顯示所有文章
顯示具有 [程式]C++ 標籤的文章。 顯示所有文章

2015年10月28日 星期三

多國語言插件

適用於 CxxlMan2 程式庫的插件,可輕鬆為你開發的程式擁有多國語言的能力。
內含使用說明及範例,下載點:

cxxlMutiLang_Src_20180202.zip (支援 CMRegSelf)



2015年10月10日 星期六

CxxlMan 程式庫 停止維護

因已發佈 CxxlMan2 程式庫,即日起不再對 CxxlMan 程式庫 進行更新和修改


CxxlMan2 程式庫 開放下載

這函數庫能讓 C++ 擁有垃圾回收的能力,並提供相關的配套支援,以 C++11 的標準編寫,可以很容易跨平台。

以源碼的形式發佈,允許任何方式的應用,包括用於開發商用軟體,但不淮增、刪、改,以維持標準的一致性,有發現錯誤或建議,請留言,謝謝!!

下載點:

CxxlMan2_Src_r199.zip
  1. 為 UTF8_String 提供 Compare() 比較函數,UTF8_String 也可以處理 NULL 資料源的包裹
  2. 更改 cxxlList 的 Sort() 及 For_each() 的參數用法
  3. cxxlComposite 的 Export() 參數改用 std::function
  4. 將處理比較的 virtual cxxlAVL_Tree::Comp() 改成採用 std::function 的方式,並提供一個 GetComp() 成員函數
  5. cxxlAVL_Tree::cxxlList_Create() 增加一個 std::function 的參數作為過瀘用,原先的 cxxlList_CreateFilter() 虛擬函數已移除
  6. 將 Delegate<T> 和 Delegate2<T> 的 struct DelegateErr_NoBind 移出,放在 DELEGATE.HPP
  7. 因使用方法做了一些修改,和舊版有些不相容
  8. 增加一個 FixSlash() 函數
CxxlMan2_Src_r179.zip
  1. 重新調整永續儲存處理程式碼架構,配合 介面繼承+組合代替繼承,ref() 可不必在呼叫父類別的 ref()
  2. UTF8_String 建構函數增加  const char 單一字元參數
  3. 永續儲存修正對 UTF8_String 處理的 bug
CxxlMan2_Src_r174.zip
增加一個 BM_SEARCH.HPP
CxxlMan2_Src_r168.zip 優化 THREADMGR.HPP
修改 Delegate 和 Delegate2 的 IBind::Function() 宣告的 bug
ThreadLimit 和 ThreadPool 增加 Clear() 清除尚未處理的任務
修改一些小 bug 能通過 MinGW 編譯
CxxlMan2_Src_r162.zip
  1. 修改 Semaphore 建構函數多了一個 ThreadMaxNum 參數,並內定參數值為 {0,0}
  2. 增加 THREADMGR.HPP
  3. 修改 cxxlAVL_Tree<>::Comp() 不再為純虛擬函數,所以可不繼承直接使用
  4. 修改多處的 bug
CxxlMan2_Src_r160.zip 修改核心中的 _YanLuoWang 建構方式為 &_YanLuoWang = *new YanLuoWang,原本為變數形態,應用程式結束時,有時會出現 mutex 還在 busy 的例外錯誤,更改後 _YanLuoWang 沒有解構的機會
CxxlMan2_Src_r159.zip 增加一個 EventSender 元件,以及修改一些 bug
CxxlMan2_Src_r157.zip
  1. 為 cxxlAVL_Tree 增加 GetKeyList()
  2. 把 cxxlList_t::PT_PS_TYPE 獨立出來,比較方便使用
  3. 為 Semaphore 增加一個多載函數 Semaphore<F>::Wait(F WaitEvent),進入等待,會先呼叫 WaitEvent()
  4. 為垃圾處理核心增加一個函數 Wait_cxxlObjectDeathQueue_Emptied()
CxxlMan2_Src_r152.zip
Carry_TLC 及 Carry_MDC 的 GroupReplace,修改其 Key 為 GroupReplace_Key
CxxlMan2_Src_r151.zip
  1. Carry_TLC 及 Carry_MDC 增加 GroupReplace 選項
  2. ElementRegDelegate 增加 Import()
  3. SaveFilter 及 LoadFilter 增加 Stream()
CxxlMan2_Src_r141.zip 主要在修改 CMakeLists.txt、版本選擇... 以適應 linux
CxxlMan2_Src_r137.zip 增加 cxxlCM_GetFullDllName() CM 的轉助函數、ICM::Get_ElementRegDelegate(),修改一些 bug
CxxlMan2_Src_r129.zip 修改以下這些智能指標的組成方式,提升執行效率:
Smart_Ptr、UTF8_String、PSmart_Ptr、PSmart_Set、P2Smart_Ptr 、P2Smart_Set
CxxlMan2_Src_r127.zip


參考手冊下載:
CxxlMan2_Help_20180713.zip

另外在 Linux 須用到 uuid 函數庫,若不存在須安裝套件,比如在 Ubuntu 用以下命令安裝:
sudo apt-get install uuid-dev



2015年5月28日 星期四

如何取得最新版的 MinGW

首先要取得 MSYS2,再更新軟體倉庫,請參考下面兩個連結
http://sourceforge.net/p/msys2/wiki/MSYS2%20installation/
http://msys2.github.io/

為了預防以後失連,把重點摘錄於下:

2015年3月28日 星期六

排列組合產生器

整理來自 http://www.programmer-club.com.tw/ShowSameTitleN/c/46015.html 的討論,討論結果大致可分為遞迴法、計算法及量子演算法三種。但遞迴法有 stack overflow 的隱憂,所以改寫成模擬遞迴法;而計算法則因須要使用大數才能完整,所以加入了 goost 的 multiprecision;量子演算法要有量子電腦才能真正發揮實力,這裡使用 thread 去模擬,過這些做法象徵意義大於實質意義。

2015年2月24日 星期二

杜林機-STATE 設計模式

今天早上看了電影 模仿遊戲(The Imitation Game),其中提到「 圖靈機」讓我想起以前有寫過這樣的程式碼,原來發明人是二戰悲劇英雄,以下是我先前寫的

2014年6月22日 星期日

用 C++ 的 STL 作為參數須注意 Release 版 和 Debug 版 之間會出錯

假設某一 lib 檔是 Release 版,提供以下兩個函數:

void f1(std::string s);
std::string f2();

若呼叫端是 Release 版,呼叫這兩個函數都沒問題,但若是編譯成 Debug 版就會出錯。
不過這似乎是 vc 的問題,我在 gcc 試過不會這樣。




2014年6月11日 星期三

測試 MipmapCreate()

這次寫個程式來測試 Mipmap 建立函數 一文中的 MipmapCreate(),看看效果如何,而圖檔的讀取和儲存,採用 DevIL 這個知名的程式庫。

先看看 MipmapCreate() 建立的效果怎樣,此圖是將 Mipmap 各層的圖片疊加在一起:



看起來效果還不錯,這測試程式使用 vs2008 編寫,源碼下載:
https://www.dropbox.com/s/q3nlvb7qwkr4wg8/MipmapCreateTest.rar
http://pan.baidu.com/s/1i3BUiJ7

要編譯請先看一下內附的 ReadMe.txt 有關 DevIL 的說明。

以下列出程式碼:

2014年6月9日 星期一

Mipmap 建立函數

可以用不限長寬的圖片來產生 Mipmap 所須各圖層的圖片。

MipmapCreate() 的第一個參數 Mipmap 用於回傳 Mipmap 所有圖層的陣列,格式為
{第 0 層圖片的指標, 第 1 層圖片的指標, ... 第 LevelNum-1 層圖片的指標}

第二個參數 WidthHeight 用於回傳各層圖片的長寬,格式為
{
第 0 層圖片的 Width, 第 0 層圖片的 Height,
...
第 LevelNum-1 層圖片的 Width, 第 LevelNum-1 層圖片的 Height
}

第三個參數 LevelNum 用於回傳建立的層數


2014年5月22日 星期四

delegate 2.2 元件

相較於先前的版本,改用 operator=()/operator+=() 取代 Bind() 的功能,operator-=() 取代 Unbind 的功能;成員函數不再能直接設定,而是先用 class bind 包裝之後再設定給 delegate。簡介如下:

  • 須搭配 CxxlMan 程式庫
  • 可代理一般函數指標或成員函數指標(須先用 bind 包裝),參數最多 10 個
  • 對於有回傳值的的格式,只能設定一筆函數指標資料,多次設定後 者會取代前者,若未設定函數指標資料,執行叫用將會 throw DelegateErr_NoBind
  • 對於無回傳值的的格式,可以設定多筆函數指標資料,且會傳回一個 DelegateID,此  ID 可刪除用
  • 設定的方式採用運算元 operator=()(用於取代,即原有的全刪除),或  operator+=()(用於增加)
  • 刪除的方式採用運算元 operator-=(ID)(只刪一個),或用 Clear() 全刪除

下載點:
https://www.dropbox.com/s/b1zht5aid8hrakc/delegate%202.2.7z
http://pan.baidu.com/s/1jG1bqCm

2014年4月18日 星期五

delegate 元件

相當於 c# 的 delegate、boost 的 function,下載點:

https://www.dropbox.com/s/2qwqb516v7fi47s/delegate%202.1.7z
http://pan.baidu.com/s/1kT0rOLx

- 須搭配 CxxlMan 程式庫
- 可代理一般函數指標或成員函數指標,參數最多 10 個
- 對於有回傳值的的格式,只能 bind 一筆函數指標,若多次呼叫
  Bind(), 後者會取代前者,若無 bind,執行函數物件叫用(operator())將
  會 throw DelegateErr_NoBind
- 對於無回傳值的的格式,可以 bind 多筆函數指標資料,用 Bind() 會
  傳回一個 DelegateID,此 ID 可給 Unbind() 刪除用

以下是示範程式,

2014年4月17日 星期四

簡單實作 boost::function 的主要功能

trace goost::function 真的像在走迷宮,它使用大量的 macro 層層相扣,但也只提供最多 10 個參數可以使用,若參數個數能無限制還情有可原,只為 10 個參數搞得這麼誇張,不如使用暴力法還來得簡單明瞭。

goost::function 其實也沒什麼,主要的關鍵在要怎麼把函數的 type 分離出來,比如 goost::function<char(float,int)> 中的 char(float,int) 是一個 type,要怎麼分離出 char、float 和 int 這三個 type?goost::function 是借用特製化 class 自動匹配 type 的技巧,以下用例子說明:

2014年4月6日 星期日

成員函數指標的奇異現象

這方法蠻特殊的,不知是否有實用的價值,很像為 Base 附加功能,不過的我寧願採用延伸介面的方法

 1 #include <iostream>
 2  
 3  using namespace std;
 4  
 5  class Base1
 6  {
 7  public:
 8    // Constructor
 9    Base1(){}
10    // Destructor
11    ~Base1(){}
12  };
13  
14  class Derived1:public Base1
15  {
16    int m_data;
17  public:
18    // Constructor
19    Derived1()
20    {
21      m_data = 0;
22    }

2014年4月3日 星期四

CxxlMan 程式庫源碼

先要有一套 svn 使用端的工具,比如 TortoiseSVN,Checkout URL 填入 http://cxxlman.googlecode.com/svn,即可取得源碼。其內不包含 Make,僅是作為參考、瞭解之用。

程式庫的取得和用法在 http://cxxlman.cxxl3d.tk/




2014年2月19日 星期三

C++ 延伸介面也延伸實作

在 C++ 中若要增加一個介面類別的功能,就得從這個介面類別再延伸出一個新介面類別,在其中增加新功能,但這要實作可麻煩了,還得把舊介面所宣告的功能再寫一次,以下這範例的做法可省去這層麻煩,不過得有舊實作的原始碼才行。

注意對介面的繼承須加一個 virtual


 1 #include <iostream>
 2  
 3  using namespace std;
 4  
 5  // 介面
 6  class IBase
 7  {
 8  public:
 9    IBase(){}
10    virtual ~IBase(){}

2013年10月13日 星期日

CxxlMan 程式庫注意事項--不要在建構函數中將 this 放入 Smart_Ptr

如下:
A::A()
{
  Smart_Ptr(this);
}
這樣從建構函數返回後,A 的物件也會被銷毀,最常發生的情況應如下:
void F(const Smart_Ptr<A> &A_Arg); // 假設沒有用 Smart_Ptr 保存 A
A::A()
{
  F(this);
}
常不自覺就犯下那樣的錯誤。

2013年9月24日 星期二

cxxlOIS 元件

OIS 是一個跨平台的處理輸入裝置的函式庫,以物件導向的方式設計。OIS可以支援的輸入裝置主要是鍵盤、滑鼠、搖桿,同時也支援力回饋裝置--引言自 與Ogre共舞:第六步,敲敲鍵盤、動動滑鼠

由於編寫使用 OIS 的程式碼也蠻繁雜的,再加上為了搭配 CxxlMan 函數庫,所以寫了這個元件,把 OIS 包裝起來,並提供隨時更改 Event Handler 和 Windows 的 HWND 的能力。

2013年6月8日 星期六

CxxlSocket 通訊元件

這元件主要在簡化使用 Winsock 的程式設計,提供 Server 和 Client 兩個部份,Server 可接受多個 Client 的全雙工連線,並採取一般比較容易使用的 Event 機制。

內含原始檔及範例,請解壓到 C:\CxxlSocket 讓範例所用的路徑符合,下載點:
https://www.dropbox.com/s/guykgvnw383u5cj/CxxlSocket.7z

2012年12月21日 星期五

SList

這是一個 template class,須和 CxxlMan 程式庫一起使用,主要在提供 cxxlList 沒法做到的任意節點的提取和增刪。

下載點:https://www.dropbox.com/s/1drtnz71k8sumjz/SLIST.HPP