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