Я разрабатывал приложение MathLink с функцией, которая принимает два списка, например,
:Pattern: g[zi_List, fi_List]
, которые я намеревался добавить в функцию вручную.Оба списка могут быть реальными или сложными, а результат может быть сложным, если какой-либо из параметров является сложным.Кроме того, fi
может быть списком квадратных матриц, но zi
должен оставаться одномерным списком.
В MathLink C API наиболее простой кажущейся функцией для использования является MLGetReal64Array
, которая может обрабатывать как реальные, так и сложные типы данных, как показывает Complex
как самый внутренний Head
массива.И, как только сложность определена, массив может быть приведен к std::complex<double>
или сложному типу C99, если это необходимо.Теперь MLGetReal64Array
не обрабатывает непрямоугольный Lists
, поэтому каждый элемент List
должен иметь размерность других и быть одного типа: вещественный из сложного.Как ни странно, с функцией, которая принимает один параметр List
, MLGetReal64Array
возвращает структуру данных, которая имеет один элемент List
в качестве самого внешнего элемента, т.е. ввод h[ {1, 3, 5} ]
возвращает List[List[1,3,5]]
на стороне cвещей.
Оказывается, что для функции с двумя списками, такой как g
, один вызов MLGetReal64Array
вернет оба параметра одновременно, т.е. g
получает List[ zi, fi ]
.Так как я планирую предварительно обработать каждый список для однородности структуры и типа элемента, обеспечение того, чтобы оба элемента имели одинаковый тип элемента, не будет проблемой.Но я бы хотел, чтобы fi
был списком матриц, а MLGetReal64Array
вызывает ошибку MLEGSQ: MLGet() called out of sequence
.
Итак, мои вопросы: могу ли я использовать MLGetReal64Array
, чтобы получить оба списка?как бы я пошел об этом?И, если я не могу использовать MLGetReal64Array
, каковы мои альтернативы?
Я думаю, что если MLGetReal64Array
верен относительно структуры, я могу вытолкнуть внешний List
из ссылки с помощьюиспользуя MLGetFunction
, что позволило бы мне использовать MLGetReal64Array
для каждого параметра.Пока еще не пробовал.Но пока я буду признателен за любые предложения.