2009年10月6日 星期二

C++關鍵字:explicit

在程式設計中我們常常會遇到型別轉換的問題,如果是基礎型別的轉換,
例如:int -> double這些編譯器會自動幫我們處理,當然有時候會有資料遺失的可能,
例如: double -> int.但是如果是自訂的資料型別,編譯器要怎麼處理型別轉換的問題?

其實我們可以利用建構函數幫我們做這件事情,例如
Stonewt型別 代表一個重量值
如果該型別的建構函數為 Stonewt(double lbs);
則我們可以作以下的運算:

Stonewt mycar;
mycar = 893.5;

但是這樣又會遇到另外一個問題,這樣的轉換不是我們預期的話,有沒有辦法可以讓編譯器不要幫我們處理這樣的轉換?

所以在c++使用了一個關鍵字 explicit
所以當遇到我們不想讓編譯器自作聰明的時候可以這樣宣告建構函數

explicit Stonewt(double lbs);

這樣之前那個例子mycar = 893.5編譯器就會跟你說這樣的運算是有問題的囉!
這樣也可以避免掉一些意外的轉換

2009年10月5日 星期一

定義類別中的const成員函數

考慮下述的程式碼:

const Animal pig = Animal("Spot");
pig.eat();

通常編譯類似的程式碼時,編譯器會說明第二行會有錯誤,理由是因為eat()沒有任何引數不能保證不會修改呼叫他的物件,因為此物件是const不能被修改的,於是在c++的語法中就產生了一個新的語法就是在函數括號後放置關鍵字const,也就是說eat()的宣告應該如下:

void eat() const; //這樣宣告函數是告訴編譯器保證不會修改到呼叫他的物件

而函數的定義應該如下:

void Animal::eat() const

2009年9月24日 星期四

Flash動畫:球的彈跳




同步跟不同步I/O基本讀寫問題

我們在執行通訊埠的讀寫操作時,要使用與一般文件讀寫基本相同的Windows API函數。

而Windows的I/O操作分為兩種類型:

1.同步的(Synchronous or Nonoverlapped):當使用同步的I/O操作就必須等,操作完成後才能進行下一步的工作

2.不同步的(Asynchronous or overlapped):使用不同步的I/O操作,不必等到操作完成,就可以進行下一步的工作,當I/O操作完後,以某種機制通知該程序。

2009年9月15日 星期二

GPRS無線設備連接到外部數據網兩種方法的比較!


我們使用GPRS無線設備做數傳的時候,在連接到外部數據網時通常有兩種方法:

1.撥號上網:常見的如撥ATD *99***#
2.指定Server的IP地址、Port端口號,使用特定的AT指令來連接到外部的數據網,也即internet

例如:Simcom的GPRS模塊SIM300C採用的指令為:
AT+CIPSTART = "TCP","211.247.26.252","3030",即可連接具有公網IP地址為211.247.26.252,TCP端口號為3030的Server。


兩種方式各有特點:撥號上網的方式採用的是外部的協議棧,需要用戶自己來實現PPP、TCP、UDP等協議棧,而第二種方式則採用模塊自帶的協議棧,用戶的底層應用程序不需要實現上述較為複雜的協議棧。所以,早期的GPRS無線模塊多不帶協議棧,常用第一種方式做數傳。而自身帶有通訊協議棧的GPRS模塊多采用第二種方式。


當然,二者各有優缺點,採用第一種方式,實現起來較為複雜,但是使用靈活,用戶的數據封裝比較靈活,可以適應用戶的特殊應用。採用第二種方式,由於自身帶有完備的通訊協議棧,所以用戶實現起來較為簡單,但成本較高,數據的封裝格式也較為固定。

2009年7月2日 星期四

軟體工程:函式設計要點

  1. 應將每一個函式限制在只執行一項定義明確的工作,而且函式的名稱應充分反映出他所執行的工作。如此可以增進抽象化並提升軟體在使用性。
  2. 如果你無法選用一個恰當的名稱來代表函式在做些什麼,那麼可能是這個函式被賦予的工作太多樣化了。最好能將這種函式再切割為數個較小的函式。