2012-04-13 76 views
2

我只是想將一個整數列表傳遞給用C++編寫的函數。我建立了模板文件(.tm)和全部文件,並且我可以成功地調用帶有標量參數的測試函數。使用list參數調用該函數的行爲就好像該函數根本沒有定義。我懷疑參數類型不匹配。從Mathematica傳遞列表到C++(Mathlink)

在模板文檔(http://reference.wolfram.com/mathematica/ref/file/file.tm.html)中,列表的數據類型與「Int32List」類似。當我使用它時,我的C++函數必須爲列表長度包含一個額外的長參數。使用列表的唯一示例代碼是「sumalist.tm」。這個例子使用IntegerList(一種不出現在doku中的類型)。

當我使用Int32List時,mprep結果需要一個具有額外整數參數的函數(不會像在doku中寫入那樣長)。當我使用未記錄的IntegerList類型時,額外的參數是long類型的。

在我對標量類型進行實驗期間,我遇到了類似的問題 - 在tm文件中使用「Integer」並且沒有使用「Integer32」識別C++函數。

「sumalist.tm」示例還使用了一個奇怪的Pattern(列表:{___ Integer}),關於它我找不到任何文檔。我還想了解Evaluate行的含義(我懷疑它的使用使得函數可以在列表中沒有大括號的情況下調用)。

那麼誰知道哪些數據類型真的適合用列表調用C++函數 - 也許還有實數...?

回答

3

我對MathLink瞭解不多,但我可以解釋模式list:{___Integer}

結腸是隻爲一個名爲圖案的一般形式,即symbol:pattern只是說,該對象被稱爲由symbol必須匹配pattern。事實上,像a_Integerb__List這樣的模式實際上只是a:_Integerb:__List的簡寫形式。

所以我們留下來解釋的是{___Integer}。這是一個匹配任意多個(包括零)整數列表的模式。其工作原理如下:

{Pattern}是其內容相匹配Pattern

___Integer是零首或多個Integer個序列的模式列表中的模式。

+0

非常感謝這個解釋 - 它清除了很多東西。 – Batox 2012-04-15 13:40:30

5

MathLink template file文檔頁面上描述了MathLink數據類型(例如,Integer32Integer32List,...)到C/C++類型的映射。

頁面不再記錄舊接口類型Integer,Real,IntegerListRealList。這些應該不再使用,因爲這些類型的映射取決於其位長度依賴於平臺和編譯器的C類型(例如,long)。使用相應的具有顯式位長度的新類型(即,Integer32Integer64而不是Integer)。舊版界面類型仍記錄在有些過時的MathLink reference指南中。

以下talk slides包含一個簡單的MathLink示例,該示例演示如何實現MathLink函數,該函數將標量值添加到實數的向量中。這可能是一個起點。

+0

不,它不是,至少不深入。正如我寫的,「簡單」的情況(標量參數)適用於我經過一些試驗和錯誤,但我無法找到關於傳遞列表參數的任何細節。而在你(和我)鏈接的頁面上有一個矛盾:當我點擊「更多信息」時,出現一個數據類型列表,其中*不包含「整數」。在下面的例子中,使用了「Integer」。正如我通過實驗發現的那樣,mprep同時接受,但只有Integer實際工作。那麼這個Integer32業務是什麼? – Batox 2012-04-15 10:13:17

+0

@Batox我已經用提供更多信息和MathLink示例的鏈接更新了我的答案。 – sakra 2012-04-15 12:32:48