2012-04-13 8 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"の例では、ドキュメントが見つからなかった不思議なパターン(リスト:{___ Integer})も使用しています。私はEvaluate行が何を意味するのか理解したいと思います(リストの中括弧なしで関数を呼び出すことができると思われます)。

リストを持つC++関数を呼び出すのに本当に適切なデータ型を知っている人はいますか?

答えて

3

MathLinkについてよく分かりませんが、パターンはlist:{___Integer}です。

コロンは名前付きパターンの一般的な形式です。symbol:patternは、symbolで参照されるオブジェクトがpatternと一致する必要があると言っています。実際、a_Integerまたはb__Listのようなパターンは、実際にはa:_Integerb:__Listの短い形式です。

私たちが解釈することで残されているものは{___Integer}です。これは、任意の多くの(ゼロを含む)整数のリストと一致するパターンです。これは次のように動作します:

{Pattern}は内容Pattern

___Integerと一致するゼロまたはそれ以上のInteger秒のシーケンスのためのパターンであるリストのためのパターンです。

+0

この説明に感謝しています。 – Batox

5

Integer32,Integer32ListなどのC/C++型へのマッピングは、MathLink template fileドキュメントページに記載されています。

このページでは古いインターフェイスタイプInteger,Real,IntegerListおよびRealListがドキュメント化されなくなりました。これらの型のマッピングは、ビット長がプラットフォームおよびコンパイラに依存するC型(例えば、long)に依存するため、これらは使用されなくなります。明示的なビット長の対応する新しいタイプ(Integerの代わりにInteger32またはInteger64)を使用してください。以前のインタフェースタイプは、やや古い日付のMathLink referenceガイドに記載されています。

次のtalk slidesには、実数のベクトルにスカラー値を追加するMathLink関数を実装する方法を示す単純なMathLinkの例が含まれています。これは出発点として役立ちます。

+0

いいえ、それほど深くはありません。私が書いたように、「簡単な」ケース(スカラー引数)はいくつかの試行錯誤の後に私のために働くが、リスト引数を渡すことに関する詳細は見つけることができない。そしてあなたがリンクしているページには、矛盾があります。「その他の情報」をクリックすると、「Integer」を含まないデータ型のリストが表示されます。次の例では、 "Integer"は使用されていません。実験でわかったように、mprepは両方を受け入れますが、Integerだけが実際に動作します。このInteger32ビジネスは何ですか? – Batox

+0

@Batox私は、より多くの情報とMathLinkの例を提供するリンクを使って自分の答えを更新しました。 – sakra

関連する問題