Этот пример показывает, как совместно использовать данные о строке между графиком 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