В ходе отладки примеров использования программ на Обероне наткнулся на генерацию исключения (MATLAB сообщает об ошибке и выдаёт отладочный дамп) при попытке начать работу с числами типа REAL (они же double, они же 64-битные). Сначала думал, что это из-за указателей, но это не подтвердилось
Код выглядит так:
Код:
MODULE mexBugReport;
IMPORT mexfile, libmx, mexout;
PROCEDURE mexFunction_safe(
varargout: POINTER TO ARRAY OF libmx.mxArray;
varargin: POINTER TO ARRAY OF libmx.mxArray
);
VAR
i, classid: INTEGER;
x: REAL;
BEGIN
x:= 1;
mexout.String("Hello, World!");
mexout.Ln();
END mexFunction_safe;
BEGIN
(* Initialize callbacks *)
mexfile.mexFunction_safe:= mexFunction_safe;
END mexBugReport.
DevLinker.LinkDll
mexBug.mexw32 := National Kernel+ mexout mexfile # mexBugReport # ~
Если строку x:=1 закомментировать, то исключение не генерируется.
С помощью HIEWа и OllyDbg а выяснилось, что ошибка генерируется на фрагменте кода вида (Invalid Floating Point operation). По адресам видно, что это явно не ошибка с указателем
Код:
PUSH 033Eh
FLDCW [ESP]
Исключение "видят" как MATLAB, так и OllyDbg, который я приAttachивал к процессу MATLAB.exe и ставил брейкпоинты внутрь mex-файла в памяти
Система Windows XP Home Edition SP3, MATLAB R2010b, BlackBox Сборка 2010.09.20 для проекта Информатика-21.
P.S. Что это такое? Может ли это быть недоработкой в самом компиляторе или это нечто иное?
P.P.S. Хотя в примере mexExample2 во вложении есть работа с типом REAL, но оно там получается преобразованием из INTEGER, и ассемблерных команд, приведенных выше, там нет. И пример mexExample2 работает.