GetHelpBrowserLocationMetaTag Rest LinkTrail Tags First Null
此为 Mathematica 4 文档,内容基于更早版本的 Wolfram 语言
查看最新文档(版本11.2)
 /

2.12.5 专题:MathLink 程序的可移植性

Mathematica 这一方面与 MathLink 的关联对所有的计算机系统完全一样. 但在不同计算机系统中的外部程序之间肯定有所不同.
首先,不同的计算机系统几乎总是需要不同的可执行二进制代码. 于是, 在调用 Install["prog"] 与一个能在所用的 计算机系统上执行的程序相对应.

在不同的计算机系统中安装程序

Mathematica 约定当  是一个通常文件时,Install["prog"] 就试执行它. 而当 是一个目录时,Mathematica 将寻找它之中名称与 $SystemID 一致的一个子目录,然后试执行该子目录中名为  的文件.

编绎外部程序的典型 Unix 命令

即使可执行的外部程序的二进制在不同的计算机系统中肯定不同, 但在从C语言等中得到该 二进制代码的源代码基本上相同.
为了使源代码具有可移标植性,要注意下面几点:
首先,不要使用为特殊系统提供的C语言或C运行库而不是标准C中的功能. 另外,也不要使用段或其它特殊内存模式.
包含文件 mathlink.h 含有 MathLink 库中所有函数的标准 C 原型. 当所用编绎器 不支持这些原型时,可以在 #include "mathlink.h" 前使用指令 #define MLPROTOTYPES 0 去忽略它们. 但如果所用编绎器不支持原型时, 它必须能检查所调用的 MathLink 库函数有适当的变量类型.

使用特殊 C 类型的 MathLink 函数

在一些计算机系统和编 绎器中,C 语言中的整数等价于一个长整数. 但也可 以使 C 语言中的整数与短整数等价. 但在便携式地调用 MathLink 库函数时,必须使用与函数中相同的类型.
将数据传递给 MathLink 库函数以后,这些函数就负责处理与不同计算机 系统中这些数据表示法差异有关的问题. 例如,在不同大小的机器之间传递 数据时,MathLink 就自动淹没一些字节,转换浮点格式,尽可能地 保持精度.

一般字符串的操作

在简单的 C 程序中,一般使用仅含有常规 ASCII 字符的字符串. 但在 Mathematica 中可以使用含有各类特殊字符的字符串. 这些字符在Mathematica 中用 Unicode 字符代码给出.
C语言中 char* 字符串一般仅用 8 位去保存每个字符的代码.而 Unicode 字符代码却需要 16 位. 所以函数 MLPutUnicodeString()MLGetUnicodeString() 用无符号的短整数数组工作.
当知道所用程序不涉及特殊字符时,用 MLPutByteString()MLGetByteString() 是方便的. 这些函数直接用8位字符代码表示所有字符.如果从 Mathematica 发送一个特殊字符时,就用 MLGetByteString() 将它转换成所给出的 固定代码.

产生便携式 MathLink 程序的一个注意点

计算机系统和具有基于 Unix 模式的 C 运行库的编绎器允许 MathLink 程序 有一个主程序,其形式为 main(argc, argv),它简单地调用MLMain(argc, argv).
有些计算机系统或编绎器则需要不同形式的主程序. 要知道调用 MLMain() 之前在 main() 内可以任意进行各种初始化. 但调用了 MLMain() 之后, 程序就进入了无限循环,直到链接关闭之前它与来自 Mathematica 的需求相呼应.