В этом примере показано, как сгенерировать библиотеки или исполняемые файлы 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
), чтобы вы могли контролировать завершение программы.