В этом примере показано, как сгенерировать библиотеки 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}
Чтобы открыть отчет генерации кода, щелкните по ссылке View report.
В списке сгенерированных файлов нажмите 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) так, чтобы можно было управлять завершением программы.