Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Поскольку такую команду в первую очередь будут применять пользователи функции (а не разработчики), то желательно расположить в этих комментариях описательную информацию и сведения о правильном вызове этой функции.
Теперь подробно остановимся на вопросе об отладке M-функций, то есть на приёмах, с помощью которых можно выявить месторасположение ошибок и их причину. Система MATLAB осуществляет серьёзную помощь в этом процессе. В частности, при возникновении ошибки в процессе выполнения M-функции, в командное окно выводится приблизительное диагностическое сообщение (не следует переоценивать качество такой диагностики) и номер строки, в котором по мнению MATLABа произошла ошибка.
Другим, более развитым способом отладки функции является применение точек останова и пошаговое выполнения тела функции. Для этого применяют встроенные возможности редактора-отладчика системы MATLAB. То, что уже многократно применяемый нами редактор (в нём набираем текст функций и с помощью меню сохраняем в файле) заодно является и отладчиком, говорит даже заголовок его окна:
Matlab Editor / Debugger
так как debugger в переводе с английского означает " отладчик ".
Чтобы поставить "точку останова" на какой-либо строке кода функции, туда нужно поместить курсор и нажать клавишу F12 (повторное нажатие этой клавиши убирает точку останова). Вместо нажатия этой клавиши можно выполнить команду меню
Debug | Set/Clear Breakpoint
но всё же быстрее это можно выполнить нажатием клавиши. После этого в строке слева появляется красный кружок, указывающий на то, что в данной строке проставлена точка останова. После этого, не закрывая окна Редактора/Отладчика (Editor/Debugger), переключаем фокус ввода с клавиатуры в командное окно MATLABа и запускаем обычным образом функцию на выполнение. После этого и произойдёт останов выполнения функции прямо на строке, в которой поставлена точка останова (Breakpoint).
Теперь мы можем просматривать фактические значения входных параметров функции, текущие значения глобальных и локальных переменных, а также значения выражений. Чтобы просмотреть значение переменной, достаточно подвести курсор к её имени в тексте функции, после чего на экране появится всплывающий жёлтый прямоугольник со значением переменной внутри него:
Далее, нажимая клавишу F10 мы можем выполнять функцию построчно, каждый раз проверяя результаты такой пошаговой работы функции. В результате всегда можно "окружить ошибку" и выявить её причину.
Изменив текст функции и устранив выявленную ошибку,запускаем функцию на выполнение, в результате чего либо удостовериваемся в её правильной работе, либо находим новую ошибку. Желательно продумать методику отладки, запуская функцию на выполнение с разными значениями аргументов и разными значениями глобальных функций. В результате такого итерационнного отладочного процесса приходят к правильно работающим функциям.
#$+Массивы символов.
До сих пор мы мели дело с единственным типом данных - массивами вещественных чисел. Это действительно основной тип данных системы MATLAB, предназначенный для вычислений. В то же время, при рассмотрении графики MATLABа мы столкнулись с типом данных " короткое целое ", обозначаемое с помощью ключевого слова uint8. Этот тип данных специально предназначен для компактного хранения больших массивов целых чисел, что очень характерно для графических задач. Однако производить вычисления с типом данных uint8 нельзя (по крайней мере в версии системы MATLAB 5.2). Если всё же нужно произвести вычисления, то сначала тип данных uint8 приводят явно к типу double, производят вычисления и возвращаются к типу uint8 для дальнейшего хранения.
Во всех языках программирования, и MATLAB здесь не исключение, большую роль играет обработка текстовых данных. Для этой цели в системе MATLAB предусмотрен тип данных char (то есть "символ"). Текстовые данные, в том числе и одиночный символ, должны заключаться с обеих сторон апострофами:
c1 = 'a'; c2='abcd'; c3 = 'Hello, World!';
В результате таких присваиваний создаются переменные (естественно, это массивы - в системе MATLAB всё является массивами) типа char:
Из рисунка видно, что текстовые данные в системе MATLAB являются вектор-строками типа char (одна строка и несколько столбцов по числу содержащихся символов). Например, переменная c3 является символьным массивом (часто говорят - строкой символов) из 13 символов, занимающим 26 байт. Таким образом, под каждый символ отводится 2 байта. Каждый символ кодируется целым числом в соответствии со стандартной системой кодировки ASCII. Легко практически выяснить, какой код соответствует тому или иному символу. Следующий фрагмент
code = double(c1(1))
code=
9 7
показывает, что символу 'a' соответствует десятичное число 97.
Если после того, как переменная c3 получила текстовое значение 'Hello, World!', написать
c3 = 3.14;
то переменная c3 станет уже переменной типа double. Так как в сложных и громоздких M-функциях могут возникнуть ситуации, когда заранее неизвестен тип переменной в какой-либо момент времени исполнения функции, то с целью определения типа переменной следует применить функцию isa. Например, следующий вызов этой функции
isa(s3, 'char')
вернёт истину (единицу), если переменная s3 является в этот момент строковой (символьной), и вернёт ложь (нуль) в противоположном случае.
По отношению к массивам символов справедливы также все операции, которые мы ранее рассмотрели для случая массивов типа double. Например, вместо группового присваивания c2 = 'abcd' можно организовать поэлементное присваивание с помощью операции индексации:
c2(1)='a'; c2(2)='b'; c2(3)='c'; c2(4)='d';
или осуществить операцию конкатенации
c2 = [ 'abc', 'd' ]; c2 = [ c2, ' QWERTY' ];
В тесной связи с рассмотренной операцией конкатенации текстовых строк находится стандартная функция int2str, которая преобразует целые числовые значения в символы, отображающие эти целые числа. Например, вызов функции
res = int2str(2)
приведёт к появлению текстовой переменной res со значением '2'. В итоге, мы имеем возможность сформировать в цикле набор нескольких имён функций, отличающихся только последним символов - их номером:
name = 'function'; arg = 10.7;
for k = 1: 10
Name = [ name,int2str(k) ];
res(k) = feval(Name, arg);
End
и даже вычислить значения всех таких функций при значении аргумента arg. Это осуществляется с помощью стандартной функции системы MATLAB feval, которая принимает в качестве своего первого аргумента текстовую строку с именем M-функции, подлежащей вычислению. Второй и последующие аргументы этой функции служат для передачи в качестве аргументов вычисляемым функциям.
В вышеприведённом фрагменте результаты вычислений десяти функций запоминаются в массиве res.
Если требуется в одной переменной запомнить несколько имён функций (это возможно в случае их одинаковой длины) для последующего их исполнения с помощью feval, то можно сформировать текстовый массив размерности 2;
Names(1,:) = 'function1';
Names(2,:) = 'function2';
Первая строка этого массива содержит имя первой функции, вторая строка - второй функции. Размер этого массива типа char есть 2 x 9.
Часто текстовые строки используются для вывода в командное окно системы MATLAB для информирования пользователя о ходе выполнения M-функции. Это осуществляется с помощью функции disp, принимающей в качестве аргумента текстовую строку:
x = 7;
message = [ ' Variable x = ', int2str(x) ];
Дата публикования: 2015-01-23; Прочитано: 258 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!