Mathematica 9 is now available

2.12.14 在外部程序中运行 Mathematica

在外部程序中运行 Mathematica 需要利用 MathLink 的许多特点.第一个问题是如何将 MathLink 连接到 Mathematica.
MathLink 模板产生能从 Mathematica 调用的外部程序时,建立 MathLink 连接的源代码会自动产生,在外部程序中要做的就是调用 MLMain(argc, ##1). 但一般要调用几个函数去建立 MathLink 连接.

打开和关闭 MathLink 连接

包括标准 MathLink 头函数

#include "mathlink.h"

int main(int argc, char *argv[]) {

MLENV env;
MLINK link;
long errno;

初始化 MathLink 库函数

env = MLInitialize(0);

打开一个 MathLink 连接,使用传递到主程序的同一变量响应

link = MLOpenArgv(env, argv, argv+argc, &errno);

激活连接,等待其它程序

MLActivate(link);

...
}

传递给 MLOpenArgv()argv 常常是直接从整个程序开始时传递给 main() argv 得到. 注意,MLOpenArgv() 将指针置于 2 数组的开头和结尾. 不直接使用 argc 就避免知道一个 int 的大小.
2 数组中的元素是字符串,它反映 Mathematica 函数 LinkLaunch, LinkCreateLinkConnect 的变量选项.

可能传递给MLOpenArgv( )的argv数组元素

MLOpenArgv() 的另一种选择是 MLOpenString(), 它将参数并置在一个字符串中, 参数中间有空格.
打开 MathLinkMathematica 内核的连接后,就能用标准的 MathLink 函数交换数据.

与 Mathematica 内核通讯的常用函数

MLPutFunction() 等发送了所有包以后,MathLink 要求调用 MLEndPacket() 去确认同步性和一致性.
在编写与 Mathematica 内核直接通讯的外部程序时,一个主要的方面是处理内核可以产生 的各种包.
函数 MLNextPacket() 寻找下一个来自于内核的包的头部,返回一个表明 该包类型的常数.

MLNextPacket( ) 识别的一些包

一直从一个链接读数据,遇到一个错误或发现一个 ReturnPacket 时停止

while ((p = MLNextPacket(link)) && p NotEqual RETURNPKT)
MLNewPacket(link);

将一个完整的前端写入 Mathematica 时,需要处理 Mathematica 能产生的各种 类型的包. 一般是在 MLNextPacket() 返回值上设置一个适当的转换 来完成这一任务.
MathLink Developer Kit 含有几个简单但完整的前端源代码的样本.

链接中的数据流

像前端等更复杂外部程序的特点之一是在等待从 Mathematica 发送的数据时 进行运算. 而在调用 MLNextPacket() 等标准 MathLink 库函数时, 直到该函数所需的数据备齐前程序是锁住的.
反复调用 MLReady() 可避免锁住,当 MLReady() 返回的不是 0 值时 仅调用 MLNextPacket() 等函数即可. MLReady()Mathematica 函数 LinkReadyQ 相似.
注意,MathLink 有时会将要发送的数据放在缓冲区内. 为了保证所有数据被送出. 应该调用 MLFlush(). 这之后调用 MLReady() 和等待返回的数据才有意义.



Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.