В этом примере показано, как совместно использовать данные о строке между графиком Stateflow® и пользовательский код С. Можно экспортировать данные о строке от диаграммы Stateflow до функции C при помощи str2ascii
оператор. Можно импортировать выход кода С как данные о строке в диаграмме Stateflow при помощи ascii2str
оператор. Путем обмена данными с пользовательским кодом можно увеличить поддержку Stateflow и усилить программное обеспечение, чтобы использовать в своих интересах существующий ранее код. Для получения дополнительной информации см. Пользовательский код Повторного использования в диаграммах Stateflow.
Эта модель содержит диаграмму Stateflow, которая вызывает две функции от пользовательского кода С. В процессе моделирования график берет в качестве его входа строку, которая содержит текст, представляющий число с плавающей запятой в экспоненциальной форме. График состоит из трех состояний что:
Ищите входная строка для продвижения обнуляет, десятичная точка и e
.
Проанализируйте строку в числа с двойной точностью, представляющие мантиссу и части экспоненты входа.
Объедините числовую информацию в выводимую строку, описывающую вход в экспоненциальном представлении.
Например, если входной строкой является "0123.456e789"
, затем график выводит строку "0123.456e789 means 1.23456 times ten to the 791th power
".
Можно использовать str2ascii
оператор, чтобы преобразовать данные о строке в массив, который можно экспортировать от диаграммы Stateflow до пользовательской функции кода С.
В функции пользовательского кода объявите входную переменную как имеющий тип char*
.
В диаграмме Stateflow преобразуйте строку в массив типа uint8
путем вызова оператора str2ascii
.
Вызовите функцию пользовательского кода путем передачи uint8
массив как вход.
Например, в предыдущем графике, Search
состояние преобразует входную строку str
к uint8
массив Asrt
. Search
утвердите передает этот массив как вход к функции пользовательского кода searchfun
:
extern void searchfun(int* nout, char* strin) { nout[0] = strspn(strin,"0"); nout[1] = strcspn(strin,".e"); nout[2] = strcspn(strin,"e"); nout[3] = strlen(strin); }
Search
состояние вызывает эту функцию с командой searchfun(n,Astr)
. Функция заполняет целочисленный массив n
с этими значениями:
n[0]
содержит количество продвижения, обнуляет во входной строке str
.
n[1]
содержит количество символов перед первой инстанцией десятичной точки или e
. Этот результат обеспечивает количество символов перед десятичной точкой в str
.
n[2]
содержит количество символов перед первой инстанцией e
. Этот результат обеспечивает количество символов в мантиссе в str
.
n[3]
содержит длину входной строки str
.
Parse
утвердите использует эти результаты извлечь значения мантиссы и части экспоненты входа.
Можно импортировать данные о строке к диаграмме Stateflow путем передачи указателя на массив типа uint8
как вход к пользовательской функции C.
В функции пользовательского кода объявите входную переменную, содержащую указатель как имеющий тип char*
.
Сохраните данные о выводимой строке от функции пользовательского кода в местоположении, обозначенном указателем.
В диаграмме Stateflow преобразуйте uint8
массив к строке путем вызова оператора ascii2str
.
Например, в предыдущем графике, Merge
состояние консолидирует числовую информацию, полученную Parse
состояние в выводимую строку путем вызова пользовательского кода функционирует mergefun
:
extern void mergefun(char* strout, char* strin, int in0, double in1, double in2) { sprintf(strout, "%s means %1.*f times ten to the %dth power", strin, in0, in1, (int) in2); }
Merge
утвердите вызывает mergefun
функция с командой mergefun(Asout,Astr,y0,y1,y2)
:
Asout
массив типа uint8
указывая на выход пользовательской функции.
Astr
массив типа uint8
соответствие входной строке к графику.
y0
целое число, содержащее количество цифр справа от десятичной точки в мантиссе.
y1
и y2
числа с двойной точностью, представляющие мантиссу и части экспоненты входа.
Функциональный mergefun
вызывает библиотечную функцию C sprintf
, слияние содержимого Astr
, y1
, и y2
и хранение результата в ячейке памяти обозначается Aout
. График использует оператор ascii2str
преобразовывать этот выход в строку sout
. Таким образом модель импортирует строку, созданную функцией пользовательского кода назад в Stateflow.
ascii2str | str2ascii | str2double | strcat | substr