2.12.9 与外部程序的两种通讯方式用 Install 安装一个与 MathLink 相容的外部程序时,该程序被设置为有点像简化的 Mathematica 内核一样去工作. 每次调用程序中的一个函数时,向该程序 发送一个 CallPacket 包,该程序的响应是回送一个包装在 ReturnPacket 内的 结果. 这里安装一个外部程序,返回用于连接这个程序的 LinkObject
Out[6]= |  |
函数 ExternalCall 向外部程序发送 CallPacket
可以用 LinkWrite 直接发送 CallPacket. CallPacket 的第一个变量指出要调用外部程序内的函数 这里是外部程序对 CallPacket 的响应
Out[9]= |  |
把一个外部程序 Install 安装几次时,Mathematica 就对这个程序打开几个 MathLink 连接. 每个连接总是对应于唯一的 LinkObject. 注意,在有些计算机系统 中,为了多次调用一个外部程序,需要将含有这个程序的文件进行拷贝. 认定单个外部程序的各种例程
:Begin: :Function: addto
这里将 $CurrentLink 作为 addto 的一个变量
:Pattern: addto[$CurrentLink, n_Integer]
:Arguments: n :ArgumentTypes: Integer :ReturnType: Integer :End:
每次程序开始时,将全局变量 counter 置为 0
int counter = 0;
int addto(int n)  counter += n; return counter;
这里安装含有 addto 的外部程序的一个例程
Out[10]= |  |
这里安装另一个例程
Out[11]= |  |
给外部程序的第一个例程中的 counter 加 10
Out[12]= |  |
给外部程序的第一个例程中的 counter 加 15
Out[13]= |  |
这里重新在程序的第一个例程上工作
Out[14]= |  |
如果一个外部程序保持了其状态信息,就可以用程序的不同例程来表示其不同的 状态. $CurrentLink 就提供了引用程序不同例程的方式. 当第一次安装外部程序的例程时或每次运行程序的一个例程时就设置一次 $CurrentLink 的值. 发送一个 Mathematica 计算的字符串 MathLink 连接的双向功能可以用 Mathematica 调用外部程序,也可以使外部程序 调用 Mathematica. 在最简单的情况中,可以用 MathLink 函数 MLEvaluateString() 向 Mathematica 发送一个字符串. Mathematica 计算这个字符串,进行该字符串 指定的操作,但不向外部程序返回任何结果. 为了使结果返回,必须明确地向 Mathematica 发送一个 EvaluatePacket, 然后读出所返回的 ReturnPacket 中的内容.
...
这里开始一个 EvaluatePacket
MLPutFunction(stdlink, "EvaluatePacket", 1);
这里构造表达式 Factorial[7] 或 7!
MLPutFunction(stdlink, "Factorial", 1); MLPutInteger(stdlink, 7);
这里说明正在构造的包已经完成
MLEndPacket(stdlink);
这里查看返回的 ReturnPacket
MLCheckFunction(stdlink, "ReturnPacket", &n);
从这个包得到 7! 的结果
MLGetInteger(stdlink, &ans);
...
发送一个包到 Mathematica 向 Mathematica 发送一个 EvaluatePacket[input] 时,它一般会产生许多包来响应, 但最后一个包必须是 ReturnPacket[output]. 2.12 节中将讨论怎样处理事先不知道 结构的这些包或表达式序列.
|