NS2学习笔记_tcl和Otcl
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
join list joinString以joinString为分隔符将列表的元素合成,例如
join {1 {2 3} {4 5 6}}:
1:2 3:4 5 6;#得到的新列表
split string splitString用指定的字符串分隔string字符串得到新列表,例如
set line {sahdfjkshdajkfjk}
mflood set id 100;#设定id
OTCL脚本中如果要访问C++类的函数只能通过C++类中
command(int argc,const char*const* argv)来实现,例如:
int MFloodAgent::command(int argc,const char*const* argv)
成员变量和成员函数:成员函数实例:
Animal instproc init {args}
{
$self set speed_;#
}
Animal instproc funname args
{
$self instvar speed_;#声明成员变量
#函数体
}
Animal为类名instproc为关键字funname为函数名,args为参数
}
} class_mflood_agent;
当tcl脚本中使用new Agent/MFlood则调用了MFloodAgent类
OTCL语言访问C++类的成员变量:OTCL语言如果要使用C++类的成员变量,则需要通过c++类中bind函数来实现,可以被bind的变量类型有int float bool时间带宽5种,例如在c++类MFloodAgent的构造函数中
{
Tcl& tcl=Tcl::instance();
if(strncasecmp(argv[1],"id",2)==0)//通过比较tcl脚本中传递//过来的字符串来判断执//行哪一段操作
{
//执行一定操作
return TCL_OK;//成功返回TCL_OK否则返回//TCL_ERROR
}
return Agent::commend(argc,argv);
switch–exact --$value
{
1 {操作} ;#如果$value为1
2 {操作} ;#如果$value为2
}
其中$value为待匹配的值
参数-exact表示匹配模式为精确匹配,严格大小写
其他匹配模式还有-glob和-regexp,在ns仿真中不常见
while语句:与C的while类似,例如:
set ll [split $line a]
s hdfjkshd jkfjk;#得到的列表
OTCL语言
1.TCL语言中的类和对象与C++语言中的类与对象相同,声明建立一个类使用Class关键字例如
Class animal
2.调用TCL类是用new关键字,例如new Agent;建立类的实例对象时调用类的init函数,销毁对象时调用destroy函数
static classMFloodAgentClass :public TclClass{
public:
MFloodAgentClass () : TclClass("Agent/MFlood") {}
TclObject* create(int, const char*const*) {
return (newMFloodAgent());
建立数组:set arr(index) value
arr为数组名,index为索引,value为对应得值
有关数组的命令:
array names返回数组中定义的索引名,例如array names arr;#得到数组arr的索引(也是个数组)
array size得到数组的大小,例如:
set i {array size arr};#将i设为arr数组的大小
while {$i==1}
{
#执行内部代码
}
没有do…while语句
循环语句for:与C的类似例如,用大括号代替了小括号
for {set i 0} {$i<10} {incr i}
{
#执行内部函数
}
循环语句foreach,foreach从一个数组中依照每个元素的值进行处理,例如
#用list命令构建一个名为ll的数组,这个数组的
MFloodAgent::MFloodAgent(nsaddr_t id):Agent(nsaddr_t id)
{
bind(“id”,&id );/*实现变量id的绑定*/
}
在TCL脚本中就可以使用id,例如:
set mflood [new Agent/MFlood];#tcl中实例MFloodAgent对象
{
#执行内部代码
return;#可以有可以没有
}
proc为关键字表明这是一个过程,name为过程名,params为传递给过程的参数,函数定义时不管有没有返回值,都不用设定,TCL语言中用户不直接接触指针,在过程中都是值传递而不是指针传递,如果想要在过程中操作全局变量,可以使用global关键字,例如:
使用array set命令建立一个数组,例如
array set fruit
{
best kiwi
worst peach
ok banana
}
其中best、worst、ok为索引值,引用时
$fruit(best)
10.TCL列表:一系列的值,在NS操作中常常用到,列表常用命令
建立列表list arg1 arg2,例如
4.属于弱类型语言,声明变量的时候无需说明变量的数据类型set i 100
5.变量引用使用$符号,例如$i代表变量i的值
6.算术操作符:+、-、*、/,逻辑与、逻辑或,位与等等与c一样
7.TCL流程控制
条件运算:if…else…与c一样,加入了if…elseif…语句同if…else if…一样
switch语句
NS2学习笔记——tcl和Otcl
TCL语言
1.解释性语言,可以使用命令行或者脚本的方式运行
2.以#和;#为注释符,其中#只能在行首注释,;#可以在行尾注释,例如:
#注释
set i 100
set j 100 ;#注释
3.所有的命令、参数都是以字符串的形式出现的例如:set a 123,set为命令,a为变量,123为值
成员变量在成员函数中用$self instvar声明
父类与子类继承:象C语言一样,OTCL子类可以继承父类的特性,父类的函数,所有的变量和函数都是public的,继承时使用superclass关键字,例如
Class MobileNode -superclass Node
引用父类的函数,是用next关键字,例如:MobileNode instproc init {args}
}
TCL脚本中调用command函数有两种方式:显式调用和隐式调用,
、显式调用:命令中包含cmd命令,例如
mflood cmd id 100
则直接把cmd id 100这个字符串传给mflood对应的C++类中command函数来处理argv[0]为“cmd”argv[1]为“id”argv[2]为“100”
、隐式调用,不含cmd命令,例如:
mflood id 100;#若tcl脚本中没有id函数则将cmd id 100这个字符串传给mflood对应的C++类中command函数来处理
set randomSeed 0;#设定一个变量
proc RandomInit {seed}
{
global randomSeed;#使用全局变量
set randomSeed $seed;#对全局变量设定值
}
9.数组:与c语言不同,数组是一个集合,数组中的每一个元素对应一个索引,索引相当于c语言中数组的下标,但是tcl数组中的索引可以为字符串,可以为数字,并且tcl数组可以不设定数组的大小
lappend ll feng
lreplace list i j arg1 arg2 ...将list列表的i到j的元素换为arg1 arg2 ...例如:
lreplace ll 2 2 feng;#将第2个元素换为feng
linsert list index arg1 arg2 ...将arg1 arg2等元素插入到list列表第index个元素之前
{
$self next $args;#调用父类的init函数
}
OTCL语言与C++语言的结合
1.在NS仿真中,自建新的协议或者扩展已有协议(MAC,路由,linklayer等层),需要用C++来实现,用OTCL语言来调用
例如已经用C++写好了一个名字为MFloodAgent的类,现在想要在OTCL语言中使用这个类,需要一个中间类连接OTCL和C++类,这个类必须继承自TclClass,重写这个类的create函数实现OTCL类到C++类的映射,例子中这个类名字为MFloodAgentClass,是个静态类
set ll [list 1 2];#ll的值为1 2
或直接set ll {1 2}
lindex list i返回list列表的第i个元素,例如:
set j [lindex ll 1]
llength list返回list列表的长度,例如:set i [llength ll]
lappend list arg1 arg2...将arg1、arg2等等添加到list列表的最后,例如:
array set ll { 0 aa 1 bb 2 cc} ;#第一个元素为aa,第二个为bb,第三个为cc
forreach i ll
{
puts $i ;#i依次等于ll数组中的各个元素
}
break和continue与c中的用法作用一样
8.过程:相当于c语言中的函数,语法如下:
proc name params
join {1 {2 3} {4 5 6}}:
1:2 3:4 5 6;#得到的新列表
split string splitString用指定的字符串分隔string字符串得到新列表,例如
set line {sahdfjkshdajkfjk}
mflood set id 100;#设定id
OTCL脚本中如果要访问C++类的函数只能通过C++类中
command(int argc,const char*const* argv)来实现,例如:
int MFloodAgent::command(int argc,const char*const* argv)
成员变量和成员函数:成员函数实例:
Animal instproc init {args}
{
$self set speed_;#
}
Animal instproc funname args
{
$self instvar speed_;#声明成员变量
#函数体
}
Animal为类名instproc为关键字funname为函数名,args为参数
}
} class_mflood_agent;
当tcl脚本中使用new Agent/MFlood则调用了MFloodAgent类
OTCL语言访问C++类的成员变量:OTCL语言如果要使用C++类的成员变量,则需要通过c++类中bind函数来实现,可以被bind的变量类型有int float bool时间带宽5种,例如在c++类MFloodAgent的构造函数中
{
Tcl& tcl=Tcl::instance();
if(strncasecmp(argv[1],"id",2)==0)//通过比较tcl脚本中传递//过来的字符串来判断执//行哪一段操作
{
//执行一定操作
return TCL_OK;//成功返回TCL_OK否则返回//TCL_ERROR
}
return Agent::commend(argc,argv);
switch–exact --$value
{
1 {操作} ;#如果$value为1
2 {操作} ;#如果$value为2
}
其中$value为待匹配的值
参数-exact表示匹配模式为精确匹配,严格大小写
其他匹配模式还有-glob和-regexp,在ns仿真中不常见
while语句:与C的while类似,例如:
set ll [split $line a]
s hdfjkshd jkfjk;#得到的列表
OTCL语言
1.TCL语言中的类和对象与C++语言中的类与对象相同,声明建立一个类使用Class关键字例如
Class animal
2.调用TCL类是用new关键字,例如new Agent;建立类的实例对象时调用类的init函数,销毁对象时调用destroy函数
static classMFloodAgentClass :public TclClass{
public:
MFloodAgentClass () : TclClass("Agent/MFlood") {}
TclObject* create(int, const char*const*) {
return (newMFloodAgent());
建立数组:set arr(index) value
arr为数组名,index为索引,value为对应得值
有关数组的命令:
array names返回数组中定义的索引名,例如array names arr;#得到数组arr的索引(也是个数组)
array size得到数组的大小,例如:
set i {array size arr};#将i设为arr数组的大小
while {$i==1}
{
#执行内部代码
}
没有do…while语句
循环语句for:与C的类似例如,用大括号代替了小括号
for {set i 0} {$i<10} {incr i}
{
#执行内部函数
}
循环语句foreach,foreach从一个数组中依照每个元素的值进行处理,例如
#用list命令构建一个名为ll的数组,这个数组的
MFloodAgent::MFloodAgent(nsaddr_t id):Agent(nsaddr_t id)
{
bind(“id”,&id );/*实现变量id的绑定*/
}
在TCL脚本中就可以使用id,例如:
set mflood [new Agent/MFlood];#tcl中实例MFloodAgent对象
{
#执行内部代码
return;#可以有可以没有
}
proc为关键字表明这是一个过程,name为过程名,params为传递给过程的参数,函数定义时不管有没有返回值,都不用设定,TCL语言中用户不直接接触指针,在过程中都是值传递而不是指针传递,如果想要在过程中操作全局变量,可以使用global关键字,例如:
使用array set命令建立一个数组,例如
array set fruit
{
best kiwi
worst peach
ok banana
}
其中best、worst、ok为索引值,引用时
$fruit(best)
10.TCL列表:一系列的值,在NS操作中常常用到,列表常用命令
建立列表list arg1 arg2,例如
4.属于弱类型语言,声明变量的时候无需说明变量的数据类型set i 100
5.变量引用使用$符号,例如$i代表变量i的值
6.算术操作符:+、-、*、/,逻辑与、逻辑或,位与等等与c一样
7.TCL流程控制
条件运算:if…else…与c一样,加入了if…elseif…语句同if…else if…一样
switch语句
NS2学习笔记——tcl和Otcl
TCL语言
1.解释性语言,可以使用命令行或者脚本的方式运行
2.以#和;#为注释符,其中#只能在行首注释,;#可以在行尾注释,例如:
#注释
set i 100
set j 100 ;#注释
3.所有的命令、参数都是以字符串的形式出现的例如:set a 123,set为命令,a为变量,123为值
成员变量在成员函数中用$self instvar声明
父类与子类继承:象C语言一样,OTCL子类可以继承父类的特性,父类的函数,所有的变量和函数都是public的,继承时使用superclass关键字,例如
Class MobileNode -superclass Node
引用父类的函数,是用next关键字,例如:MobileNode instproc init {args}
}
TCL脚本中调用command函数有两种方式:显式调用和隐式调用,
、显式调用:命令中包含cmd命令,例如
mflood cmd id 100
则直接把cmd id 100这个字符串传给mflood对应的C++类中command函数来处理argv[0]为“cmd”argv[1]为“id”argv[2]为“100”
、隐式调用,不含cmd命令,例如:
mflood id 100;#若tcl脚本中没有id函数则将cmd id 100这个字符串传给mflood对应的C++类中command函数来处理
set randomSeed 0;#设定一个变量
proc RandomInit {seed}
{
global randomSeed;#使用全局变量
set randomSeed $seed;#对全局变量设定值
}
9.数组:与c语言不同,数组是一个集合,数组中的每一个元素对应一个索引,索引相当于c语言中数组的下标,但是tcl数组中的索引可以为字符串,可以为数字,并且tcl数组可以不设定数组的大小
lappend ll feng
lreplace list i j arg1 arg2 ...将list列表的i到j的元素换为arg1 arg2 ...例如:
lreplace ll 2 2 feng;#将第2个元素换为feng
linsert list index arg1 arg2 ...将arg1 arg2等元素插入到list列表第index个元素之前
{
$self next $args;#调用父类的init函数
}
OTCL语言与C++语言的结合
1.在NS仿真中,自建新的协议或者扩展已有协议(MAC,路由,linklayer等层),需要用C++来实现,用OTCL语言来调用
例如已经用C++写好了一个名字为MFloodAgent的类,现在想要在OTCL语言中使用这个类,需要一个中间类连接OTCL和C++类,这个类必须继承自TclClass,重写这个类的create函数实现OTCL类到C++类的映射,例子中这个类名字为MFloodAgentClass,是个静态类
set ll [list 1 2];#ll的值为1 2
或直接set ll {1 2}
lindex list i返回list列表的第i个元素,例如:
set j [lindex ll 1]
llength list返回list列表的长度,例如:set i [llength ll]
lappend list arg1 arg2...将arg1、arg2等等添加到list列表的最后,例如:
array set ll { 0 aa 1 bb 2 cc} ;#第一个元素为aa,第二个为bb,第三个为cc
forreach i ll
{
puts $i ;#i依次等于ll数组中的各个元素
}
break和continue与c中的用法作用一样
8.过程:相当于c语言中的函数,语法如下:
proc name params