В ходе отладки примеров использования программ на Обероне наткнулся на генерацию исключения (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 работает.