NS2中添加OTcl与C之间的连接.docxVIP

  • 3
  • 0
  • 约4.1千字
  • 约 8页
  • 2021-04-12 发布于天津
  • 举报
NS2 中添加 OTcl 与 C++ 之间的连接 翻译自 NS by Example ,见笑 原文地址: 原文地址: /NS/linkage.html 图 18 1.将 C++ 类导出至 OTcl 假定你已经使用 C++ 创建了一个新的网络对象类, 比如继承 自 Agent 类的 MyAgent ,并且你想在 OTcl 中创建该对象的 实例。为此,你必须定义一个继承自 TclClass 的连接对象, 比如 MyAgentClass 。该连接对象用于创建一个有着特定名 称(如该例的 Agent/MyAgentOtcl )的 OTcl 对象,并且在 OTcl 对象和 C++ 对象(如该例中的 MyAgent )之间创建连 接。并且在 C++ 对象的 create 成员函数中指定了实例的开始 过程( launching procedure )。 2.将 C++ 变量导出至 OTcl 假设你的新的 C++ 对象 MyAgent 中有两个参数变量,比如 my_var1 和 my_var2 ,这两个变量必须够够通过使用 OTcl 模拟脚本来很容易地进行配置(或改变) 。为此,你应当对 C++ 类中的每个你想导出的变量使用绑定函数。绑定函数在 对应的 OTcl 对象类(如 Agent/MyAgentOtcl )中使用给定 的名字 (第一个参数) 创建新的成员变量, 并且建立在 OTcl 变量和 C++ 变量(变量的地址通过第二个参数确定)之间的 双向绑定。 图 19 显示了怎样对图 18 中的两个变量 my_var1 和 my_var2 进行绑定。 19 注意,为了在对象的实例被创建时建立绑定,绑定函数应放 置在 MyAgent 的构造函数内。 NS 支持 4 种不同的绑定函数, 适用于如下 5 种不同的变量类型: - bind(): 浮点型和整型变量 - bind_time(): 时间变量 - bind_bw(): 带宽变量 - bind_bool(): 布尔变量 通过这种方法,使用 OTcl 脚本来设计并进行模拟的用户可 以对使用 C++ 实现的网络组件中的可以配置的参数 (或者变 量值)进行访问或者改变。注意,强烈建议无论何时导出 个 C++ 变量,都应当同时在 ns-2/tcl/lib/ns-lib.tcl 中设置该变 量的默认值。否则,当创建新对象的实例时会有警告信息。 3 .将C++对象控制命令导出至 OTcl C++ 对象的些变量之外,你可能还想让 OTcl 得到你的C++ 对象的控制权。这可以通过定义你的 C++ 对象(例如, C++ 对象的 些变量之外,你可能还想让 OTcl 得到你的 C++ 对象的控制 权。这可以通过定义你的 C++ 对象(例如, MyAgent )的 command 成员函数来实现。 该成员函数充当 OTcl 命令的解 释器的角色。事实上,在 C++ 对象的 command 成员函数中 定义的 OTcl 命令看起来与相应的展示给用户的 OTcl 对象的 成员函数相同。图 20 是一个一个对图 18 中的 MyAgent 对 象的 command 成员函数的定义例子。 图 20 当匹配 MyAgent 对象的 OTcl 影像对象的实例在 OTcl 内被 创建(例如,使用了 set myagent [new Agent/MyAgentOtcl] 命令),并且用户试图调用该对象的成员函数时(例如,使 用 $myagent call-my-priv-func ), OTcl 会在 OTcl 对象中搜 索给定的成员函数名。如果给定的成员函数名未能找到,那 么将会调用 MyAgent::command来以#8220; 参数名 /参数值 么将会调用 MyAgent::command 来以#8220; 参数名 /参数 值#8221; 的形式传递被调用的 OTcl 成员函数的参数的名 称和参数值。如果在 command 成员函数中存以在被调用的 OTcl 成员函数的名称定义的操作, 那它执行请求并返回结果。 如果不存在, command 成员函数的祖先会被依次递归调用, 直到发现该名称。如果在任何一个祖先中都未能发现该名称, 则返回给 OTcl 对象一个错误信息, 并且该 OTcl 对象显示给 用户一条错误信息。通过这种方式,用户可以在 OTcl 内控 制 C++ 对象的行为。 4.从 C++ 中执行 OTcl 命令 如果你用C++实现了一个新的网络对象, 你或许从C++对象 中执行一条 OTcl 命令。图 21 显示了图 18 中的 MyAgent 对象的 MyPrivFunc 成员函数的实现。 它让 OTcl 解释器打印 出私有成员变量 my_var1 和 my_var2 的值。 为了从 C++ 中执行一条

文档评论(0)

1亿VIP精品文档

相关文档