Совместно используйте данные о строке с пользовательским кодом С

В этом примере показано, как совместно использовать данные о строке между графиком Stateflow® и пользовательский код С. Можно экспортировать данные о строке от диаграммы Stateflow до функции C при помощи str2ascii оператор. Можно импортировать выход кода С как данные о строке в диаграмме Stateflow при помощи ascii2str оператор. Путем обмена данными с пользовательским кодом можно увеличить поддержку Stateflow и усилить программное обеспечение, чтобы использовать в своих интересах существующий ранее код. Для получения дополнительной информации см. Пользовательский код Повторного использования в диаграммах Stateflow.

Эта модель содержит диаграмму Stateflow, которая вызывает две функции от пользовательского кода С. В процессе моделирования график берет в качестве его входа строку, которая содержит текст, представляющий число с плавающей запятой в экспоненциальной форме. График состоит из трех состояний что:

  • Ищите входная строка для продвижения обнуляет, десятичная точка и e.

  • Проанализируйте строку в числа с двойной точностью, представляющие мантиссу и части экспоненты входа.

  • Объедините числовую информацию в выводимую строку, описывающую вход в экспоненциальном представлении.

Например, если входной строкой является "0123.456e789", затем график выводит строку "0123.456e789 means 1.23456 times ten to the 791th power".

Экспортируйте данные о строке от Stateflow до C

Можно использовать str2ascii оператор, чтобы преобразовать данные о строке в массив, который можно экспортировать от диаграммы Stateflow до пользовательской функции кода С.

  1. В функции пользовательского кода объявите входную переменную как имеющий тип char*.

  2. В диаграмме Stateflow преобразуйте строку в массив типа uint8 путем вызова оператора str2ascii.

  3. Вызовите функцию пользовательского кода путем передачи 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 утвердите использует эти результаты извлечь значения мантиссы и части экспоненты входа.

Импортируйте данные о строке от C до Stateflow

Можно импортировать данные о строке к диаграмме Stateflow путем передачи указателя на массив типа uint8 как вход к пользовательской функции C.

  1. В функции пользовательского кода объявите входную переменную, содержащую указатель как имеющий тип char*.

  2. Сохраните данные о выводимой строке от функции пользовательского кода в местоположении, обозначенном указателем.

  3. В диаграмме 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.

Смотрите также

| | | |

Похожие темы