NS2学习笔记

 NS的类库都是建立于TClCl的基础上,共包含6个:Tcl, TclObject, TclClass, TclCommand, EmbeddedTcl和InstVar.
 1、Tcl类
 Tcl类封装的是OTcl解释器真正的实例,并提供访问解释器的方法,Tcl类提供的主要方法如下:
 a,获得Tcl实例的指针。Tcl &tcl = Tcl::instance();
 b,通过解释器调用OTcl过程。提供四种方法调用一个OTcl命令,这四种方法在调用参数方面有本质区别,如果解释器返回TCL_OK,
则这些函数将会返回一个相应的OTcl过程,若解释器返回TCL_ERROR,则这些函数将会调用tkerror{},用户可以重载这个过程,以
便忽略某些错误。
 这四种方法是:

  1. tcl.eval(char *s)调用Tcl_GlobalEval(),通过解释器解释字符串s,执行相应操作。
  2. tcl.evalc(const char *s)保存字符串参数s。本方式将字符串s复制到中间缓存区,然后再在中间缓存区里面调用之前的eval(char *s)。
  3. tcl.eval()假设命令已经存储在internal bp_类中,本方式直接调用tcl.eval(char *bp_),缓存区自己的指针可以通过tcl.buffer(void)方法获得。
  4. tcl.evalf(const char *s, ...)类似于一个printf。

 c,取出或者将结果返回解释器。

当一个解释器调用一个c++方法时,它所期望的结果能够返回私有成员变量tcl_->result。有两种方法可以设置这个变量。

  1. tcl.result(const char *s),将结果字符串传回解释器。
  2. tcl.result(const char * fmt, ...),用vsprintf来格式化结果,再将结果字符串返回解释器。

同样的,当一个c++方法调用一个Otcl命令时,解释器会返回结果到tcl_->result。tcl.reslut(void)必须用于取回结果。需要注意的是这个结果是一个字符串,它必须被转化成一个合适结果类型的内部格式,如:

1 tcl.evalc("Simulator set NumberInterfaces_");
2 char *ni = tcl.result();
3 if(atoi(ni) != 1)
4 tcl.evac("Simulator set NumberInterfaces_ 1");

 

d,报告错误状态并以同意的方法退出。

编译代码中提供一种统一的报告错误方法。tcl.error(const char *s)执行以下功能,将s写入到stdout;将tcl_->result写入stdout。

 e,存储并查找"TclObjects"。

NS将每个TclObject在编译层次的一个指针存储在一个hash表中,这样就能快速地访问该对象。该hash在解释器的内部。

  1. tcl.ecter(TclObject *o),将在hash表中插入一个指向类TclObject的对象的指针,它被TclClass::create_shadow()用来在创建对象时插入表中。
  2. tcl.lookup(char *s),将取回名为s 的TclObject,可以这样使用TclObject::lookup。
  3. tcl.remove(TclObject *o),将删除hash表中的一个指针,可以用TclClass::delete_shadow()来移出hash表中存在的入口,此时该对象已经被删除。

这些函数是在TclObject类和TclClass类内部使用的。 

f,获取对解释器的直接访问。

如果以上方法依然不够,那么必须获得解释器的句柄(handler),用来编写我们自己的函数。tcl.interp(void)返回一个解释器的handle,并存储在TCl类中。

2、TclObject类

a,创建和销毁解释对象

TclObject类是所有编译类的基类,对应的SplitObject类是所有解释器类的基类,当用new{}创建一个解释器对象时,会调用它的构造函数init{},并把用户提供的参数传递给它。这个构造函数必须明确地调用父类的构造函数,那么在NS中最厚一个构造函数就是SplitObject对象的构造函数,这个构造函数通过create-shadow函数创建一个该解释器对象对应的影像对象,并执行该影像对象的构造函数,在此通常会为类中的对象建立相应的变量绑定以及其他必要的初始化操作。在影像对象成功创建后,create-shadow会执行以下操作。

  1. 将新的对象加入到TclObjects的hash表中
  2. 使cmd{}成为新创建的解释对象的实例化过程。这个实例化过程会调用编译对象的command()函数。

注意,上面的创建影像对象机制只有当用户从解释器中创建对象时才起作用,如果用户直接在c++中创建一个编译对象,其 OTcl中的影像对象是不会被创建的。

b,变量绑定

NS支持5种不同数据类型的绑定变量:实数变量、整形变量、时间变量、带宽变量、布尔型变量。

c,command函数

NS为每个解释对象建立cmd{}实例过程,作为hook通过编译的影像对象执行一些函数。cmd{}过程自动调用影像对象的command函数,并将command函数的参数以矢量的形式传递给cmd。调用cmd有两种方式,一种是显示调用,将所需的操作指定为第一个参数,另一种为隐士调用。

cmmand有两个参数:argc和argv,函数返回值必须是TCL_OK或者TCL_ERROR,如果操作匹配成功,则进入该操作的程序段,向解释器传递执行结果,并返回,如果没有匹配成功,它将调用父类的command函数,并返回相应的结果。

3、TclClass类

TclClass类是个纯虚类,作为基类提供接口。从TclClass派生出来的类有两种功能:构造与编译层次结构互为影像的解释器层次结构以及提供实例化编译对象的方法。

你可能感兴趣的:(学习笔记)