В этом примере показано, как создавать библиотеки C или исполняемые файлы, которые обнаруживают ошибки времени выполнения и сообщают о них, например, индексирование массива вне границ. Если сгенерированный код C обнаруживает ошибку, он сообщает сообщение и завершает программу. Это позволяет обнаруживать и исправлять ошибки, возникающие только на целевом оборудовании.
Запишите функцию getelement индексирует в одно поле структуры, используя значение другого поля структуры.
function y = getelement(S) %#codegen y = S.A(S.u); end
Создайте объект конфигурации кода для автономной библиотеки или исполняемого файла. Например, создайте объект конфигурации кода для статической библиотеки. Включите отчет о создании кода.
cfg = coder.config('lib');
cfg.GenerateReport = true;Создание отчетов и обнаружения ошибок во время выполнения.
cfg.RuntimeChecks = true;
Определите пример ввода, который можно использовать для задания свойств входного аргумента.
S.A = ones(2,2); S.u = 1;
Создать код.
codegen -config cfg getelement -args {S}
Чтобы открыть отчет о создании кода, щелкните ссылку Просмотр отчета.
В списке созданных файлов щелкните getelement.c.
Можно просмотреть код, который проверяет наличие ошибки и вызывает функцию для сообщения об ошибке. Например, если код обнаруживает ошибку индексирования массива вне границ, он вызывает rtDynamicBoundsError для сообщения об ошибке и завершения программы.
/* Include files */
#include "getelement.h"
#include "getelement_rtwutil.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
/* Variable Definitions */
static rtBoundsCheckInfo emlrtBCI = { 1,/* iFirst */
4, /* iLast */
2, /* lineNo */
5, /* colNo */
"S.A", /* aName */
"getelement", /* fName */
"C:\\Users\\username\\Documents\\MATLAB\\runtime-error-ex\\getelement.m",/* pName */
0 /* checkKind */
};
static rtDoubleCheckInfo emlrtDCI = { 2,/* lineNo */
5, /* colNo */
"getelement", /* fName */
"C:\\Users\\username\\Documents\\MATLAB\\runtime-error-ex\\getelement.m",/* pName */
1 /* checkKind */
};
/* Function Definitions */
double getelement(const struct0_T *S)
{
int i;
if (S->u != (int)floor(S->u)) {
rtIntegerError(S->u, &emlrtDCI);
}
i = (int)S->u;
if ((i < 1) || (i > 4)) {
rtDynamicBoundsError(i, 1, 4, &emlrtBCI);
}
return S->A[i - 1];
}Программное обеспечение отчетов об ошибках использует fprintf для записи сообщений об ошибках в stderr. Он использует abort для завершения работы приложения. Если fprintf и abort недоступны, их необходимо предоставить. abort функция резко завершает программу. Если система поддерживает сигналы, можно перехватить сигнал прекращения (SIGABRT), чтобы можно было управлять завершением программы.