關於 Cyclomatic complexity 一詞可參考 Wikipedia 上的解說。
中譯名稱是「循環複雜度」或者又稱為「迴圈複雜度」。主要是用來描述一個程式「條件分支」的複雜度,因為愈單純的 If-condition 愈容易讀懂,除錯時也較好發現問題所在。所以複雜度的數值,愈低愈好。在下面兩個情形複雜度的值都會加一:
下列程式的 Cyclomatic complexity 分數是:2
foo()
{
if (condition)
printf ("hello");
}
下列程式的 Cyclomatic complexity 分數是:3
foo()
{
if (condition-X || condition-Y)
printf ("hello");
}
在 Cygwin 的 FAQ 中有提到:How do I uninstall all of Cygwin?
(1) 列出已安裝 cygwin service:cygrunsrv -L
(2) 停用並移除 Cygwin service:
cygrunsrv --stop [service_name]
cygrunsrv --stop inetd (參照 FAQ 說明)
cygrunsrv --remove [service_name]
(3) 砍掉 cygwin 目錄
(4) 移除註冊碼
HKEY_LOCAL_MACHINE\Software\Cygwin
HKEY_CURRENT_USER\Software\Cygwin

四月真是個練習程式的好日子,因為又到了每年論文趕稿時刻。左圖描述 MobileNode 類別與 Node 類別兩者間的關係,顯然 MobileNode 是 Node 的延伸類別。在 ns2 中如果想要得知節點的座標資訊,可以使用 getLoc() 這個函式。該函式定義在 mobilenode.h 底下,所以使用前記得引入這個標頭檔。函式內容如下:
class MobileNode : public Node
{
public:
inline void getLoc(double *x, double *y, double *z) {
update_position(); *x = X_; *y = Y_; *z = Z_;
}
}
使用方法是先將 Node 指標強制轉型成 MobileNode 指標再引用該函式。下面是一個小小的範例:
#include "mobilenode.h"
double x,y,z;
Node *p = Node::get_node_by_address(index);
((mobileNode *)p)->getLoc(&x, &y, &z);
回歸正題 LEACH 為 Low-Energy Adaptive Clustering Hierarchy 的簡稱,是一個在 Sensor Network 上廣為人知的路由協定。手頭上拿到一份給 ns2 用的模組(mit.tar.gz)還有安裝文件。因為該模組是針對 ns2.27 進行修正,對於其他版本而言,不可以直接使用取代方式安裝該模組。
比較正確的作法是照著安裝文件中的「檔案列表」,找出該模組新增的區段,然後針對各原始檔複製加入該區段。這些區段其實都用 #ifdef MIT_uAMPS 與 #endif 包圍起來,所以還蠻好辨識,這是模組擴增的部份。
另一個要修改的地方是 Makefile,以便進行LEACH模組的編譯。
* 在 DEFINE list 中加入 -DMIT_uAMPS
* 在 INCLUDEs list 中加入 -I./mit/rca -I./mit/uAMPS
* 在 gaf/gaf.o \ 之前加入
mit/rca/energy.o mit/rca/rcagent.o \
mit/rca/rca-ll.o mit/rca/resource.o \
mac/mac-sensor-timers.o mac/mac-sensor.o mit/uAMPS/bsagent.o \
最後進行 make 收工;至於模組的使用方法跟架構,就留給有心研究的人去試了 :Q
proxytrace2any.cc: In function `int main(int, char**)':
proxytrace2any.cc:112: error: `IsLittleEndian' undeclared (first use this function)
proxytrace2any.cc:112: error: (Each undeclared identifier is reported only once for each function it appears in.)
proxytrace2any.cc:120: error: `ToOtherEndian' undeclared (first use this function)
make[1]: *** [proxytrace2any.o] Error 1
問題點在於「proxytrace2any.cc」這隻程式,因為使用到兩個未經定義(undeclared)的函數。修正方法:找到檔案 /indep-utils/webtrace-conv/dec/my-endian.h
將下列兩行註解起來:
#ifndef _ENDIAN_H_ 與
#endif
如同下面範例:
//#ifndef _ENDIAN_H_ ... 註解
#define _ENDIAN_H_
#include "proxytrace.h"
/* detects endian-ness */
int IsLittleEndian(void);
/* changes endian-ness */
void ToOtherEndian(TEntry *e);
//#endif ... 註解
int offset; // 宣告全域變數
int& set() // 回傳 Reference
{
return offset;
}
int main()
{
set()=13;
return 0;
}
第一次看到時覺得很奇怪。不過後來有人解說:當呼叫函數 set()時,會回傳一個參考值(Reference),此值是是指向 offset 這個變數。也就是說 set()執行結果:會回報一個Reference,而此「參考」本質上就是 offset 的別名。因此當使用「set()=13」時,表示間接執行「offset=13」這個動作。
Recent Comments