Передача списков из Mathematica в C++ (Mathlink)

Я просто хочу передать список целых чисел в функцию, написанную на C++. Я настроил файл шаблона (.tm) и все, и я могу успешно вызывать тестовую функцию со скалярными аргументами. Вызов функции с аргументом list ведет себя так, как будто функция не была определена вообще. Я подозреваю, что типы аргументов не совпадают.

В документации к шаблонам (http://reference.wolfram.com/mathematica/ref/file/file.tm.html) тип данных для списков выглядит примерно так: "Int32List". Когда я использую это, моя функция C++ должна содержать дополнительный длинный параметр для длины списка. Единственный пример кода, который использует список, это "sumalist.tm". В этом примере используется IntegerList (тип, который отсутствует в доку).

Когда я использую Int32List, результат mprep требует функции с дополнительным целочисленным аргументом (не так долго, как написано в doku). Когда я использую недокументированный тип IntegerList, дополнительный аргумент имеет тип long.

Во время моих экспериментов со скалярными типами у меня была похожая проблема - функция C++ правильно вызывалась при использовании "Integer" в tm-файле и не распознавалась с "Integer32".

В примере "sumalist.tm" также используется странный шаблон (список:{___Integer}), о котором я не нашел никакой документации. Я также хотел бы понять, что означает строка Evaluate (я подозреваю, что ее использование делает функцию вызываемой без фигурных скобок вокруг списка).

Итак, кто знает, какие типы данных действительно подходят для вызова функции C++ со списком - может быть, также с реальными...?

2 ответа

Решение

Я не знаю много о MathLink, но я могу объяснить шаблон, list:{___Integer},

Двоеточие - это просто общая форма для именованного шаблона, то есть symbol:pattern просто говорит, что объект, на который ссылается symbol должен соответствовать pattern, Действительно, картина как a_Integer или же b__List на самом деле просто короткие формы для a:_Integer а также b:__List,

Так что мы остаемся с толкованием {___Integer}, Это шаблон, соответствующий списку произвольных многих (включая ноль) целых чисел. Это работает следующим образом:

{Pattern} шаблон для списка, содержимое которого совпадает Pattern

___Integer шаблон для последовательности от нуля или более Integers.

Отображение типов данных MathLink (например, Integer32, Integer32List,...) для типов C/C++ описано на странице документации файла шаблона MathLink.

Страница больше не документирует старые типы интерфейса Integer, Real, IntegerList а также RealList, Они больше не должны использоваться, потому что отображение этих типов зависит от типов C, чья длина бит зависит от платформы и компилятора (например, long). Вместо этого используйте соответствующий новый тип с явной длиной в битах (т.е. Integer32 или же Integer64 вместо Integer). Старые типы интерфейсов по-прежнему документированы в несколько устаревшем справочном руководстве MathLink.

Следующие слайды обсуждения содержат простой пример MathLink, который показывает, как реализовать функцию MathLink, которая добавляет скалярное значение к вектору действительных значений. Это может послужить отправной точкой.

Другие вопросы по тегам