Как лучше обрабатывать ошибки? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Как лучше обрабатывать ошибки в Си? У меня науме только такой вариант. Допустим есть функция, которая выполняет сложение матриц.
/* DATA TYPES */
typedef int BOOL;
 
/* ERROR */
#define ERROR_OK    0
#define ERROR_SIZE -2
 
BOOL add (int ** lp_res, int ** lp_op, size_t nrow_res, size_t ncol_res, size_t nrow_op, size_t ncol_op)
{
    int i = 0, j = 0;
 
    if (nrow_res != nrow_op || ncol_res != ncol_op)
        return ERROR_SIZE;
 
    for (i = 0; i < nrow_res; ++i)
        for (j = 0; j < ncol_res; ++j)
            lp_res[i][j] += lp_op[i][j];
 
    return ERROR_OK;
}
Может лучше будет использовать какие-то выриант с глобальными переменными? Вроде как завести переменную error и походу выполнения функции закидывать в нее значение ошибки?
    if (nrow_res != nrow_op || ncol_res != ncol_op)
        error = ERROR_SIZE;
    else
        for (i = 0; i < nrow_res; ++i)
            for (j = 0; j < ncol_res; ++j)
                lp_res[i][j] += lp_op[i][j];
И еще вопрос как лучше для матриц проверять указатели? Написать какой-нибудь макрос с ассертами, чтобы можно было его просто выключить? Или писать отдельную BOOL функцию и по ее результату выполнять дальнейшие действия?

Решение задачи: «Как лучше обрабатывать ошибки?»

textual
Листинг программы
void add_m (int ** lp_res, int ** lp_op, size_t nrow_res, size_t ncol_res, size_t nrow_op, size_t ncol_op)
{
    int i = 0, j = 0;
 
#ifdef _DEBUG 
    /* check the validity of pointers */
    check_matrix_memory(lp_res, nrow_res); /* assert(lp_res != NULL && lp_op != NULL); */
    check_matrix_memory(lp_op, nrow_op);   
    /* check the validity of sizes */
    assert(nrow_res == nrow_op && ncol_res == ncol_op);
#endif /* defined _DEBUG */
 
    for (i = 0; i < nrow_res; ++i)
        for (j = 0; j < ncol_res; ++j)
            lp_res[i][j] += lp_op[i][j];
}

Объяснение кода листинга программы

  1. В данной функции происходит сложение двух матриц.
  2. Присваиваются значения для переменных:
    • i = 0, j = 0;
  3. Проверяется правильность выделения памяти под матрицы и их размерность с помощью макроса assert.
  4. Происходит цикл по строкам первой матрицы.
  5. В каждой итерации происходит цикл по столбцам второй матрицы.
  6. Элементы матрицы lp_res[i][j] складываются с элементами матрицы lp_op[i][j].
  7. Результат сохраняется в элементе lp_res[i][j].

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы