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

В этом примере показано, как поделиться строковыми данными между графиком 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. The 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);
}

The Search состояние вызывает эту функцию с помощью команды searchfun(n,Astr). Функция заполняет целочисленный массив n с этими значениями:

  • n[0] содержит количество начальных нулей в входе строке str.

  • n[1] содержит количество символов перед первым образцом десятичной точки или e. Этот результат обеспечивает количество символов перед десятичной точкой в str.

  • n[2] содержит количество символов перед первым образцом e. Этот результат обеспечивает количество символов в значении и в str.

  • n[3] содержит длину входа строки str.

The 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);
}

The 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.

См. также

| | | |

Похожие темы