您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > NS2学习笔记-tcl和Otcl
NS2学习笔记——tcl和OtclTCL语言1.解释性语言,可以使用命令行或者脚本的方式运行2.以#和;#为注释符,其中#只能在行首注释,;#可以在行尾注释,例如:#注释seti100setj100;#注释3.所有的命令、参数都是以字符串的形式出现的例如:seta123,set为命令,a为变量,123为值4.属于弱类型语言,声明变量的时候无需说明变量的数据类型seti1005.变量引用使用$符号,例如$i代表变量i的值6.算术操作符:+、-、*、/,逻辑与、逻辑或,位与等等与c一样7.TCL流程控制○1条件运算:if…else…与c一样,加入了if…elseif…语句同if…elseif…一样○2switch语句switch–exact--$value{1{操作};#如果$value为12{操作};#如果$value为2}其中$value为待匹配的值参数-exact表示匹配模式为精确匹配,严格大小写其他匹配模式还有-glob和-regexp,在ns仿真中不常见○3while语句:与C的while类似,例如:while{$i==1}{#执行内部代码}没有do…while语句循环语句for:与C的类似例如,用大括号代替了小括号for{seti0}{$i10}{incri}{#执行内部函数}循环语句foreach,foreach从一个数组中依照每个元素的值进行处理,例如#用list命令构建一个名为ll的数组,这个数组的arraysetll{0aa1bb2cc};#第一个元素为aa,第二个为bb,第三个为ccforreachill{puts$i;#i依次等于ll数组中的各个元素}break和continue与c中的用法作用一样8.过程:相当于c语言中的函数,语法如下:procnameparams{#执行内部代码return;#可以有可以没有}proc为关键字表明这是一个过程,name为过程名,params为传递给过程的参数,函数定义时不管有没有返回值,都不用设定,TCL语言中用户不直接接触指针,在过程中都是值传递而不是指针传递,如果想要在过程中操作全局变量,可以使用global关键字,例如:setrandomSeed0;#设定一个变量procRandomInit{seed}{globalrandomSeed;#使用全局变量setrandomSeed$seed;#对全局变量设定值}9.数组:与c语言不同,数组是一个集合,数组中的每一个元素对应一个索引,索引相当于c语言中数组的下标,但是tcl数组中的索引可以为字符串,可以为数字,并且tcl数组可以不设定数组的大小建立数组:setarr(index)valuearr为数组名,index为索引,value为对应得值有关数组的命令:○1arraynames返回数组中定义的索引名,例如arraynamesarr;#得到数组arr的索引(也是个数组)○2arraysize得到数组的大小,例如:seti{arraysizearr};#将i设为arr数组的大小○3使用arrayset命令建立一个数组,例如arraysetfruit{bestkiwiworstpeachokbanana}其中best、worst、ok为索引值,引用时$fruit(best)10.TCL列表:一系列的值,在NS操作中常常用到,列表常用命令○1建立列表listarg1arg2,例如setll[list12];#ll的值为12或直接setll{12}○2lindexlisti返回list列表的第i个元素,例如:setj[lindexll1]○3llengthlist返回list列表的长度,例如:seti[llengthll]○4lappendlistarg1arg2...将arg1、arg2等等添加到list列表的最后,例如:lappendllfeng○5lreplacelistijarg1arg2...将list列表的i到j的元素换为arg1arg2...例如:lreplacell22feng;#将第2个元素换为feng○6linsertlistindexarg1arg2...将arg1arg2等元素插入到list列表第index个元素之前○7joinlistjoinString以joinString为分隔符将列表的元素合成,例如join{1{23}{456}}:1:23:456;#得到的新列表○8splitstringsplitString用指定的字符串分隔string字符串得到新列表,例如setline{sahdfjkshdajkfjk}setll[split$linea]shdfjkshdjkfjk;#得到的列表OTCL语言1.TCL语言中的类和对象与C++语言中的类与对象相同,声明建立一个类使用Class关键字例如Classanimal2.调用TCL类是用new关键字,例如newAgent;建立类的实例对象时调用类的init函数,销毁对象时调用destroy函数成员变量和成员函数:成员函数实例:Animalinstprocinit{args}{$selfsetspeed_;#}Animalinstprocfunnameargs{$selfinstvarspeed_;#声明成员变量#函数体}Animal为类名instproc为关键字funname为函数名,args为参数成员变量在成员函数中用$selfinstvar声明父类与子类继承:象C语言一样,OTCL子类可以继承父类的特性,父类的函数,所有的变量和函数都是public的,继承时使用superclass关键字,例如ClassMobileNode-superclassNode引用父类的函数,是用next关键字,例如:MobileNodeinstprocinit{args}{$selfnext$args;#调用父类的init函数}OTCL语言与C++语言的结合1.在NS仿真中,自建新的协议或者扩展已有协议(MAC,路由,linklayer等层),需要用C++来实现,用OTCL语言来调用例如已经用C++写好了一个名字为MFloodAgent的类,现在想要在OTCL语言中使用这个类,需要一个中间类连接OTCL和C++类,这个类必须继承自TclClass,重写这个类的create函数实现OTCL类到C++类的映射,例子中这个类名字为MFloodAgentClass,是个静态类staticclassMFloodAgentClass:publicTclClass{public:MFloodAgentClass():TclClass(Agent/MFlood){}TclObject*create(int,constchar*const*){return(newMFloodAgent());}}class_mflood_agent;当tcl脚本中使用newAgent/MFlood则调用了MFloodAgent类OTCL语言访问C++类的成员变量:OTCL语言如果要使用C++类的成员变量,则需要通过c++类中bind函数来实现,可以被bind的变量类型有intfloatbool时间带宽5种,例如在c++类MFloodAgent的构造函数中MFloodAgent::MFloodAgent(nsaddr_tid):Agent(nsaddr_tid){bind(“id”,&id);/*实现变量id的绑定*/}在TCL脚本中就可以使用id,例如:setmflood[newAgent/MFlood];#tcl中实例MFloodAgent对象mfloodsetid100;#设定idOTCL脚本中如果要访问C++类的函数只能通过C++类中command(intargc,constchar*const*argv)来实现,例如:intMFloodAgent::command(intargc,constchar*const*argv){Tcl&tcl=Tcl::instance();if(strncasecmp(argv[1],id,2)==0)//通过比较tcl脚本中传递//过来的字符串来判断执//行哪一段操作{//执行一定操作returnTCL_OK;//成功返回TCL_OK否则返回//TCL_ERROR}returnAgent::commend(argc,argv);}TCL脚本中调用command函数有两种方式:显式调用和隐式调用,○1、显式调用:命令中包含cmd命令,例如mfloodcmdid100则直接把cmdid100这个字符串传给mflood对应的C++类中command函数来处理argv[0]为“cmd”argv[1]为“id”argv[2]为“100”○2、隐式调用,不含cmd命令,例如:mfloodid100;#若tcl脚本中没有id函数则将cmdid100这个字符串传给mflood对应的C++类中command函数来处理
本文标题:NS2学习笔记-tcl和Otcl
链接地址:https://www.777doc.com/doc-5332005 .html