Лекция 9. Разработка интерфейсных программ. Компиляция m файлов.

Белошапкин В.В.

 

Содержание

Функция uicontrol для разработки интерфейсных программ 
Как из функции на языке matlab приготовить код на языке Си и из него
приготовить exe-файл 
  
  
  
 
  
 Задачи 



Функция uicontrol для разработки интерфейсных программ

Функция uicontrol является основной функцией для разработки интерфейсных программ. Она размещает в памяти и высвечивает на указанном графическом окне интерфейсные элементы. Следующие две строки открывают графическое окно и размещают на нем интерфейсный элемент. h1=figure; hu=uicontrol(h1); Тип интерфейсного элемента, его размеры, расположение в графическом окне, цвет и т.д. определяются значениями полей интерфейсного объекта. Посмотреть все возможные поля объекта и их значения по умолчанию можно командой set(hu). В следующей таблице приводятся некоторые поля интерфейсных объектов и их возможные значения. Значения по умолчанию выделеня в фигурные скобки.
Поле Назначение
BackgroundColor Определяет цвет объекта.
FontUnits

Единицы измерения размера шрифта. Возможные значения

[ inches | centimeters | normalized | {points} | pixels ]

FontName Имя шрифта.
FontSize Размер шрифта.
Units

Единицы измерения для положения элемента в графическом окне

и его размеров. Начало системы координат всегда в левом нижнем

углу. Возможные значения [ inches | centimeters | normalized | points | {pixels} | characters ]. Обычно для поля Units используют значение normalized. При таком выборе в левом нижнем углу графического окна всегда расположена точка (0,0), а в правом верхнем (1,1). Это позволяет создавать интерфейсы, независящие от разрешения монитора и фактического размера графического окна на дисплее.

 

Position Определяет положение левого нижнего угла элемента и его ширину и высоту. Задается вектором из четырех элементов. Например, строка set(hu,'position',[0.1 0.1 0.4 0.5]); задает левый нижний угол в точке (0.1,0.1) , ширину 0.4 и высоту 0.5.
Style Определяет тип интерфейсного элемента. Возможные значения [ {pushbutton} | togglebutton | radiobutton | checkbox | edit | text | slider | frame | listbox | popupmenu ].
 
String Задает надпись на интерфейсном элементе.
UiContextmenu Ссылка на всплывающее меню, связанное с обектом.
Callback Определяет имя функции, которая вызывается , когда с объектом происходит событие ( например, щелчок мыши на объекте).
Например, чтобы создать интерфейсный объект типа togglebutton (кнопка с двумя положениями - утопленная и отжатая) и написать функцию для обработки нажатий нужно написать в матлабе global ht ht=uicontrol(h1,'style','togglebutton','callback','togl');. Для обработки нажатий на кнопку нужно написать функцию togl, которая может выглядеть примерно так function togl() global ht val=get(ht,'value'); if val==0 % кнопка отжата . . . else %кнопка утоплена . . . end Когда происходит нажатие на кнопку togl, вызывается функция togl. Эта функция получает указатель на объект ht через оператор global. Функция get считывает значение поля 'value' объекта ht. Это поле определяет состояние объекта togglebutton, 0 - кнопка отжата, 1 - кнопка утоплена. Следующий пример размещает интерфейсный объект типа 'popup' и иписывает функцию mycall для обработки событий. global hpop hpop=uicontrol('style','popup','units','normalized','position',[0.1 0.1 0.4 0.05],... 'string','hsv|hot|cool|jet','callback',mycall'); Функция mycall выглядит примерно так: function mycall() global hpop val=get(hpop,'value'); switch val % выбираем высвеченную строку case 1 % высвечена первая строка . . . case 2 % высвечена вторая строка . . . otherwise . . . end Вид элемента popup показан на рис. 3.1. Рис. 3.1 В качестве полного примера приведу программу для отрисовки графика заданной функции. Все необходимые интерфейсные элементы отрисовываются функцией graphic.m. function graphic() %#function myplot global x0 dx xend fun h1=figure; a1=axes('units','normalized','position',[0.1 0.1 0.8 0.5]); set(h1,'currentaxes',a1,'numbertitle','off','name','grafik f(t)'); xlabel('t'); ylabel('f'); pos=[0.1 0.7 0.1 0.05]; x0=uicontrol('style','edit','units','normalized','position',pos,'string','0'); pos1=[0.1 0.77 0.1 0.05]; dx=uicontrol('style','edit','units','normalized','position',pos1,'string','0.1'); pos2=[0.1 0.84 0.1 0.05]; xend=uicontrol('style','edit','units','normalized','position',pos2,'string','1'); pos3=[0.01 0.7 0.07 0.05]; uicontrol('style','text','units','normalized','position',pos3,'string','t0'); pos4=[0.01 0.77 0.07 0.05]; uicontrol('style','text','units','normalized','position',pos4,'string','dt'); pos5=[0.01 0.84 0.07 0.05]; uicontrol('style','text','units','normalized','position',pos5,'string','tend'); pos6=[0.01 0.91 0.07 0.05]; uicontrol('style','pushbutton','units','normalized','position',pos6,... 'string','plot','backgroundcolor',[1 0 0],'callback','myplot'); pos7=[0.3 0.91 0.5 0.05]; fun=uicontrol('style','edit','units','normalized','position',pos7,'string',... 'cos(2*pi*t).*exp(-t.^2)'); pos8=[0.2 0.91 0.08 0.05]; uicontrol('style','text','units','normalized','position',pos8,'string','f(t)='); Вот как выглядит результат работы этой функции на экране. При нажатии кнопки plot вызывается функция myplot из файла myplot.m, которая и отрисовывает график. function myplot() global x0 dx xend fun s1=get(x0,'string'); s2=get(dx,'string'); s3=get(xend,'string'); s4=get(fun,'string'); sx=strcat('[',s1,':',s2,':',s3,']'); t=eval(sx); % выполняем строку sx, как команду матлаба и результат заносим в t. %next string for compilation to the standalone application only %you can to comment these string for work in matlab only str=strrep(s4,'t',sx); % замена в строке s4 символа t на строку sx f=eval(str); % строка str выполняется как команда матлаба, а результат заносится в f plot(t,f); Читателю предоставляется самостоятельно разобрать текст фугнкции myplot. Замечу лишь, что замена символа t в строке s4 на строку sx связана с тем, что в дальнейшем функция myplot будет компилироваться в Cи код. В матлаб запрещено компилировать в Си функции содержащие вызов функции eval со строкой, содержащей имена переменных из рабочего пространства матлаба.

Как из функции на языке matlab приготовить код на языке Си и из него приготовить exe-файл

Как производится компиляция программ, написанных на языке matlab, в код на языке Си и затем готовится независимое exe-приложение я покажу на примере функции graphic.m. Прежде всего необходимо заметить, что компилируются только функции матлаба. Компиляция осуществляется с помощью компилятора mcc. Перед компиляцией необходимо настроить компилятор с помощью команды mbuild -setup, которую можно вводить либо из командного окна matlab , либо из командной строки Windows. Вот как выглядит диалог в командном окне. После настройки компилятора можно приступать к компиляции с помощью команды. mcc -m -B sgl graphic.m После компиляции в вашем рабочем каталоге образуются файлы graphic.c и graphic.exe. Файл graphic.exe является независимым exe-файлом, который может выполняться независимо от матлаба. Однако, если в вашей системе не установлен matlab, то для выполнения exe-файлов необходимо инсталлировать dll библиотеки матдаба. Они хранятся в специальном самораспаковывающемся архиве mglinstaller.exe, который обычно хранится в %MATLAB%\extern\lib\win32. Обратите внимание на вторую строку файла graphic.m. %#function myplot Все callback функции должны быть обявлены подобным образом, если функция будет компилироваться в Си.

 

 

Задачи

1. Написать интерфейсную программу для вычисления определенных интегралов. Подинтегральная функция и пределы интегрирования должны вводиться с интерфейса. 2. Используя интерфейсный элемент popup разработать интерфейс "научный калькулятор". Включить интерфейсы для отрисовки отрисовки графиков, вычисления определенных интегралов, вычисления неопределенных интегралов, дифференцирования заданной функции, разложения функции в ряд Тэйлора в окрестности заданной точки.
previous          home