2014年8月26日 星期二

VMware Workstation/Player 無法使用USB裝置的解決辦法

1. 在 "我的電腦" 的圖式上按右鍵,在下拉式選單中點選 "管理" 並點選管理視窗中的 "裝置管理員"
2. 展開 "通用序列匯流排控制器" ,雙擊所有的 "USB Root Hub" 確認驅動程式的提供者是否都是Microsoft,如果不是的話可以按下 "回復驅動程式" 來恢復成Microsoft
3. 重新啟動電腦即可

2010年2月2日 星期二

Nonblock I/O 處理技巧 in C

可以利用Signal來通知主程序I/O有資料進來,這樣可以解決主程序需要花時間polling來檢查I/O是否有資料

Signal使用方式:
1.Fill the address of the desired handler
指定Signal發生時的處理函式
2.Specify signals to be blocked during handler
當進入handler時,指定哪些signal我們要block住,避免影響handler
3.Specify how to handle the SIGIO signal
將以上的設定,跟系統註冊我們將要攔下哪一個signal
4.Arrange for SIGIO to go to this process
指定哪一個I/O發生SIGIO的信號時,是我們關心的
5.Set flags for nonblocking and asynchonous
將socket設定成nonblocking因為我們不想handler在處理的時候因為recvfrom() block住

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操作完後,以某種機制通知該程序。