Как справиться с ошибкой Fortran RTL с помощью JNA?

Я запускаю общую библиотеку (скомпилированную с помощью Intel) с использованием JNA. В редких случаях вызов Fortran заканчивается кодом forrtl : severe. Что-то типа

forrtl: severe (408): fort: (3): Subscript #1 of the array IWU has value 0 which is less than the lower bound of 1

Есть ли способ поймать эту ошибку времени выполнения с помощью JNA?


person Raphael Roth    schedule 17.07.2020    source источник
comment
Думаю, лучше бы исправить ошибку, Fortran по умолчанию начинает свои массивы с индекса 1 и это, вероятно, не учтено в вашем коде.   -  person albert    schedule 17.07.2020
comment
Вы уверены, что результаты верны, когда ошибка не возникает?   -  person Jonatan Öström    schedule 17.07.2020
comment
@albert Конечно, да, но это намного сложнее. Мы запускаем эту симуляцию Фортрана в среде больших данных (миллионы различных входных данных, некоторые из них могут быть ошибочными (нереалистичными), некоторая отказоустойчивость была бы неплохой.   -  person Raphael Roth    schedule 20.07.2020
comment
Да, может потребоваться отказоустойчивость, но это касается данных и обработки данных в программе, а не ошибки нижнего индекса, поскольку это явно указывает на ошибку программирования, когда условие не обрабатывается должным образом, что приводит к неправильному индексу. В последнем случае следует установить код ошибки/сообщение, которое возвращается через JNI, или следует выбрать правильный индекс.   -  person albert    schedule 20.07.2020


Ответы (1)


Не существует общего механизма для передачи кодов ошибок из собственного кода в JNA. В лучшем случае JNA узнает, что функция не удалась, по возвращаемому значению.

Однако, если собственный код предоставляет средства для чтения этих кодов ошибок (например, функция Windows GetLastError() или глобальная переменная errno в Linux и macOS), то можно получить более конкретные сведения.

Для серьезной ошибки Intel Fortran выполнение программы останавливается, если она не обрабатывается на собственной стороне, поэтому я не думаю, что вы можете что-то сделать, чтобы поймать ее в JNA, если только она уже не обнаружена в используемой вами библиотеке... в которой случае вам просто нужно правильно отреагировать на неудачный вызов метода. Исходный код Fortran можно модифицировать для обнаружения некоторых ошибок во время выполнения (например, в I/O , управление динамической памятью или управление изображениями) и вернуть этот статус. Однако для этой конкретной ошибки границ массива в вопросе это может не применяться.

person Daniel Widdis    schedule 19.07.2020
comment
iostat и errsns относятся к условиям системы ввода-вывода. Доступ к массиву за пределами не является ошибкой, генерируемой там. - person francescalus; 19.07.2020
comment
Он находится в списке по ссылке, которая включает верхний индекс 1 для ошибок, не возвращаемых IOSTAT. На 408 нет 1. Но я не знаю. Вот почему я сказал, что это возможно. В противном случае остальная часть ответа суммирует ситуацию. - person Daniel Widdis; 19.07.2020
comment
Цитата из описания таблицы по этой ссылке: В следующей таблице примеров сообщений в первом столбце перечислены номера ошибок, возвращаемые переменным IOSTAT при обнаружении ошибки ввода-вывода. Переменные IOSTAT используются в операторах ввода-вывода как средство предотвращения завершения программы (поэтому они не использовались бы ни в одном операторе ввода-вывода при завершении ошибки). Они не являются глобальными переменными, доступными для общих ошибок времени выполнения, таких как ошибки проверки границ. - person francescalus; 19.07.2020
comment
Справедливо. Я пытался как ответить на конкретный вопрос ОП, так и дать больше информации для более общего случая. Не стесняйтесь редактировать мой ответ, если вы считаете, что в настоящее время он неверен, как написано. - person Daniel Widdis; 19.07.2020
comment
Я пробовал редактировать в соответствии с этим. Естественно, пожалуйста, откатитесь или адаптируйте, как считаете нужным. Мне не нужно будет комментировать снова. - person francescalus; 19.07.2020