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