態變量的綁定過程驗證
作者:lzqlgq
特別感謝:robin2046
[注意]本次實驗使用了AODV代碼測試,紅色代碼爲加入代碼,實現平臺爲 Fedor core 6、ns-2.31
沒用實驗過 就不能證明方法的正確性,所以這裏我測試一下靜態變量的綁定方法,請參考ns manual 3.5.1章節
第一: 在 aodv.h中爲類AODV加入 public類型變量 static int mylen;
這裏不可以 初始化mylen ,because ISO C++ forbids in-class initialization of non-const static member ‘mylen’
在aodv.cc中爲AODVclass類加入兩個函數
static class AODVclass : public TclClass {
public:
AODVclass() : TclClass("Agent/AODV") {}
TclObject* create(int argc, const char*const* argv) {
assert(argc == 5);
//return (new AODV((nsaddr_t) atoi(argv[4])));
return (new AODV((nsaddr_t) Address::instance().str2addr(argv[4])));
}
virtual void bind();
virtual int method(int argc,const char* const* argv);
} class_rtProtoAODV;
在aodv.cc中添加兩個函數的 實現
void AODVclass::bind()
{
TclClass::bind();//注意,向上循環調用
add_method("mylen");
}
int AODVclass::method(int ac,const char* const* av)
{
Tcl& tcl=Tcl::instance();
int argc=ac-2;
const char* const* argv=av+2;
if(argc==2)
{
if(strcmp(argv[1],"mylen")==0)
tcl.resultf("%d",AODV::mylen);
return(TCL_OK);
}
else if(argc==3)
{
if(strcmp(argv[1],"mylen")==0)
AODV::mylen=atoi(argv[2]);
return (TCL_OK);
}
return TclClass::method(ac,av);
}
第三:進入命令行,在目錄ns-2.31下 使用命令make重新編譯
第四: 此時method實現的命令mylen 被綁定到類AODV上,和command實現的方法一樣,只不過是參數傳遞個數不同
第五:測試,建立文本test.tcl 內容如下
1 //test.tcl
2 puts [Agent/AODV mylen]
3 Agent/AODV mylen 8
4 puts [Agent/AODV mylen]
第六: ns test.tcl 結果如下
0
8
證明了對靜態變量的綁定成功!
2007-5-20 HITSZ