Этот пример показывает, как сгенерировать библиотеки C/C++ или исполняемые файлы, которые обнаруживают и сообщают об ошибках времени выполнения такой как за пределы индексация массива. Если сгенерированный код обнаруживает ошибку, он сообщает о сообщении и отключает программу. Можно обнаружить и зафиксировать ошибки, которые происходят только на целевом компьютере.
Запишите функциональный getelement
, который индексирует в одно поле структуры с помощью значения другого поля структуры.
function y = getelement(S) y = S.A(S.u); end
Создайте объект настройки кода для автономной библиотеки или исполняемого файла. Например, создайте объект настройки кода для статической библиотеки. Включите отчет генерации кода.
cfg = coder.config('lib'); cfg.GenerateReport = true;
Включите генерацию обнаружения ошибки времени выполнения и создания отчетов.
cfg.RuntimeChecks = true;
Задайте вход в качестве примера, который можно использовать, чтобы задать свойства входного параметра.
S.A = ones(2,2); S.u = 0;
Сгенерируйте код.
codegen -config cfg getelement -args {S}
Чтобы открыть отчет генерации кода, щелкните по ссылке View report.
В списке сгенерированных файлов нажмите getelement.c
.
Вы видите код, который проверяет на ошибку и вызывает функцию, чтобы сообщить об ошибке. Например, если код обнаруживает за пределы ошибку индексации массива, он вызывает rtDynamicBoundsError
, чтобы сообщить об ошибке и отключить программу.
/* Include Files */ #include "rt_nonfinite.h" #include "getelement.h" #include "getelement_rtwutil.h" #include <stdio.h> #include <stdlib.h> /* Variable Definitions */ static rtBoundsCheckInfo emlrtBCI = { 1, 4, 2, 5, "S.A", "getelement", "C:\\coder\\runtime checks\\getelement.m", 0 }; static rtDoubleCheckInfo emlrtDCI = { 2, 5, "getelement", "C:\\coder\\runtime checks\\getelement.m", 1 }; /* Function Definitions */ /* * Arguments : const struct0_T *S * Return Type : double */ double getelement(const struct0_T *S) { double d0; int i0; d0 = S->u; if (d0 != (int)floor(d0)) { rtIntegerError(d0, &emlrtDCI); } i0 = (int)d0; if (!((i0 >= 1) && (i0 <= 4))) { rtDynamicBoundsError(i0, 1, 4, &emlrtBCI); } return S->A[i0 - 1]; }
Программное обеспечение сообщения об ошибке использует fprintf
для сообщений ошибки при записи к stderr
. Это использует abort
, чтобы отключить приложение. Если fprintf
и abort
не доступны, необходимо обеспечить их. Функция abort
резко отключает программу. Если ваша система поддерживает сигналы, можно отловить сигнал аварийного прекращения работы (SIGABRT
) так, чтобы можно было управлять завершением программы.