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