Этот пример показывает, как совместно использовать данные о строке между графиком 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* n, 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(Aout,Astr,y0,y1,y2)
:
Aout
является массивом типа uint8
, указывающий на вывод пользовательской функции.
Astr
является массивом типа uint8
, соответствующий входной строке к графику.
y0
является целым числом, содержащим количество цифр справа от десятичной точки в мантиссе.
y1
и y2
являются числами с двойной точностью, представляющими мантиссу и части экспоненты входа.
Функциональный mergefun
вызывает библиотечную функцию C sprintf
, объединяя содержимое Astr
, y1
и y2
и храня результат в ячейке памяти, обозначенной Aout
. График использует оператор ascii2str
, чтобы преобразовать этот вывод в строку sout
. Таким образом модель импортирует строку, созданную функцией пользовательского кода назад в Stateflow.
ascii2str | str2ascii | str2double | strcat | substr