Mathematica: сообщения об ошибках MathLink

Думаю, я начинаю понимать, как связывать функции, написанные на C /C ++, с Mathematica .Проблема, с которой я столкнулся, заключается в том, что я не знаю, как отправлять сообщения об ошибках из моей оболочки C в Mathematica.После поиска в Google я нашел этот учебник MathLink .Раздел 1.7 дал мне представление о том, как отправлять сообщения об ошибках, но я получаю странные результаты.Вот код, с которым я работаю.В файле cppFunctions.h объявлены классы ---- +: = 1 =: + ---- и ---- +: = 2 =: + ---- .Я разделил этот класс до минимума, за исключением функции, которую я хочу использовать в Mathematica .Я хочу найти расстояние от одной линии до другой.Эта функция является версией C ---- +: = 3 =: + ---- в каркасах в системе Mathematica .Чтобы использовать эту функцию в Mathematica, нам нужна функция-оболочка, которая получает входные данные от Mathematica и отправляет выходные данные обратно в Mathematica .Я создал две вспомогательные функции: ---- +: = 5 =: + ---- и ---- +: = 6 =: + ----, чтобы помочь мне получить входные данные от Mathematica .Строка получается из списка, содержащего два списка.Каждый подсписок представляет собой список из 2-х вещественных чисел (точки).Чтобы попробовать эту функцию в системе Mathematica, нам нужно больше файлов.В этом файле указано, что функция LineDistance получит аргументы вручную и вернет действительное число.Последние две строчки важны.Первый ---- +: = 8 =: + ---- объявляет ---- +: = 9 =: + ---- функции.Он дает краткое сообщение о функции, когда ---- +: = 10 =: + ---- вводится в Mathematica .Другой ---- +: = 11 =: + ---- - это тот, который я хочу использовать всякий раз, когда возникает ошибка (подробнее об этом позже).Последний файл - Makefile.На данный момент мы готовы протестировать функцию в системе Mathematica.Я должен был упомянуть ранее, что я использую Mac OS X, я не уверен, как это будет работать в Windows.В mlwrapper.cpp основной функции требуется намного больше кода, который вы можете найти в одном из примеров, предоставленных Mathematica .В терминале я знаю это:Это сделает исполняемый файл ---- +: = 14 =: + ---- .Теперь мы можем начать использовать Mathematica:]Мы получаем следующий результат:ВыводВсе работает нормально, пока вы вводите правильные аргументы.То есть 2 списка, каждый из которых представляет собой список из 2 списков по 2 двойных.Может быть, есть другой способ получить исходные данные, если вы знаете, как сообщить мне.Если мы будем придерживаться этого метода, все, что нам нужно, - это способ сообщить пользователю Mathematica о любых ошибках.Очень простой - ввести неправильный ввод.Допустим, я ввожу это:Результатом будет ---- +: = 17 =: + ---- .Как насчет следующего:Результат будет ---- +: = 19 =: + ---- .Я предполагаю, что это происходит, потому что мы описали в ---- +: = 20 =: + ---- раздел ---- +: = 21 =: + ----, что функция принимает два списка ипоскольку мы дали только один, он не соответствует шаблону.Это правда?В любом случае, следуя найденному мною руководству, можно изменить файл mlwrapper.cpp следующим образом:И добавьте следующее в конец файла mlwrapper.tmТеперь давайте воспользуемся make и попробуем сделать несколько ошибок в системе Mathematica.Я выкладываю скриншот какого вывода вместо того, чтобы писать все.ВыводОбратите внимание, как мы получаем разные ошибки после повторения вызова.Кажется, что функция продолжается на строке после того, как была обнаружена ошибка.Если я не использую какие-либо другие функции ML, такие как функция ---- +: = 24 =: + ----, а я использую только ---- +: = 25 =: + ---- чтобы отправить тег ошибки, MathLink не работает, и мне нужно переустановить ссылку.Кто-нибудь знает, как отправлять сообщения об ошибках в Mathematica с C?ОБНОВИТЬ:Основываясь на полученных ответах и ​​другом полезном документе (Глава 8), мне удалось заставить его работать.Вкод на данный момент не так хорош, но это заставило меня задать следующий вопрос.Можно ли завершить функцию раньше?В обычной программе на C, если я сталкиваюсь с ошибкой, я распечатываю сообщение об ошибке и использую функцию ---- +: = 26 =: + ---- .Можем ли мы сделать что-то подобное?Если мы используем функцию ---- +: = 27 =: + ----, ссылка будет разорвана, и нам придется переустановить функцию.Возьмем, например, функции ---- +: = 28 =: + ---- и ---- +: = 29 =: + ---- .Если здесь произошла ошибка, то нет смысла продолжать вычисления в основной функции ---- +: = 30 =: + ---- .Нам нужно очистить любую полученную ошибку, отправить сообщение в Mathematica с указанием ошибки, выйти и дождаться следующего вызова.
7 голосов | спросил jmlopez 30 J0000006Europe/Moscow 2011, 00:29:35

0 ответов


Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132