将Mathematica中的列表传递给c ++(Mathlink)

时间:2012-04-13 14:12:07

标签: c++ wolfram-mathematica mathlink

我只想将整数列表传递给用C ++编写的函数。我已经设置了模板(.tm)文件和所有,我可以成功调用标量参数的测试函数。使用list参数调用函数的行为就好像根本没有定义函数一样。我怀疑参数类型不匹配。

在模板文档(http://reference.wolfram.com/mathematica/ref/file/file.tm.html)中,列表的数据类型类似于“Int32List”。当我使用它时,我的C ++函数必须包含列表长度的超长参数。使用列表的唯一示例代码是“sumalist.tm”。此示例使用IntegerList(未出现在doku中的类型)。

当我使用Int32List时,mprep结果需要一个带有额外整数参数的函数(不像在doku中写的那样长)。当我使用未记录的IntegerList类型时,额外参数的类型为long。

在我使用标量类型的实验中,我遇到了类似的问题 - 在tm文件中使用“Integer”时,正确调用了c ++函数,但未通过“Integer32”识别。

“sumalist.tm”示例还使用了一个奇怪的模式(列表:{___ Integer}),我没有找到任何文档。我还想了解Evaluate行的含义(我怀疑它的使用是使函数可调用而没有列表周围的花括号。)

那么谁知道哪些数据类型真的适合用列表调用c ++函数 - 也许还有实数...?

2 个答案:

答案 0 :(得分:5)

MathLink template file文档页面介绍了MathLink数据类型(例如Integer32Integer32List,...)到C / C ++类型的映射。

该页面不再记录旧界面类型IntegerRealIntegerListRealList。不应再使用这些,因为这些类型的映射依赖于其位长是平台和编译器相关的C类型(例如,long)。使用具有显式位长的相应新类型(即Integer32Integer64而不是Integer)。旧的界面类型仍记录在有点过时的MathLink reference指南中。

以下talk slides包含一个简单的MathLink示例,该示例演示如何实现将标量值添加到实数向量的MathLink函数。这可以作为一个起点。

答案 1 :(得分:3)

我对MathLink了解不多,但我可以解释一下模式list:{___Integer}

冒号只是命名模式的一般形式,symbol:pattern只是表示symbol引用的对象必须匹配pattern。实际上,a_Integerb__List这样的模式实际上只是a:_Integerb:__List的简短形式。

所以我们留给口译的是{___Integer}。这是一个匹配任意多个(包括零)整数列表的模式。它的工作原理如下:

{Pattern}是列表的模式,其内容与Pattern

匹配

___Integer是零个或多个Integer s序列的模式。