Разбить прямоугольный массив на 2 по четности строк с использованием тройного указателя - C (СИ)

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

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

Описание задачи: На базе заданной прямоугольной матрицы сделать 2, одна из которых содержит элементы, принадлежащие строкам с четными номерами, а вторая - с нечетными. Операцию реализовать как функцию, принимающую на вход двойной указатель на матрицу и ее размеры по каждому измерению. На выходе функция должна вернуть тройной указатель.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/* признак аварийного завершения программы при сбое вызова scanf() или при
   вылете значений из требуемого диапазона
 */
#define EXIT_INPUT_ERROR -1
// признак аварийного завершения программы при сбое вызова printf()
#define EXIT_OUTPUT_ERROR -2
// признак аварийного завершения программы при невозможности выделить память
#define EXIT_MEMORY_ERROR -3
// функция формирования матриц из четных и нечетных строк
int ***Translation(int ** matrix, size_t row, size_t col);
// функция освобождения ранее выделенной памяти тройного указателя
void freeall(int ***Translation);
 
int main(void) {
    size_t row,
           col;
    int ***Result;
    // консольный ввод с проверкой успешности результата
    if(!scanf("%d%d", &row, &col))
        return EXIT_INPUT_ERROR;
    // проверка на неравенство значений числа строк и столбцов матрицы нулю
    if (row != 0 && col != 0) {
        int matrix[row][col];
        // консольный ввод с проверкой успешности результата
        for (size_t i = 0; i < sizeof(matrix)/sizeof(matrix[0][0]); ++i)
            if(!scanf("%d", *matrix + i))
                return EXIT_INPUT_ERROR;
        int *pmatrix = matrix[0];
        int **ppmatrix = &pmatrix;
        Result = Translation(ppmatrix, row, col);
        if (Result != NULL) {
            // массив количества строк
            size_t matrixrow[2];
            // для матрицы из четных строк
            matrixrow[0] = row / 2;
            // для матрицы из нечетных строк
            matrixrow[1] = matrixrow[0] + row % 2;
            // консольный вывод с проверкой успешности результата
            for (size_t k = 0; k < 2; ++k)
                for (size_t i = 0; i < matrixrow[k]; ++i)
                    for (size_t j = 0; j < col; ++j)
                        if (!printf("%d ", *(*Result[k]) + i + j * col)) {
                            freeall(Result);
                            return EXIT_OUTPUT_ERROR;
                        }
        }
        else
            return EXIT_MEMORY_ERROR;
    }
    else
        return EXIT_INPUT_ERROR;
    freeall(Result);
    return EXIT_SUCCESS;
}
 
// функция формирования матриц из четных и нечетных строк
int ***Translation(int **matrix, size_t row, size_t col) {
    // выделение памяти под указатель на двухэлементный массив указателей на
    // результирующие матрицы
    int*** restrict Result;
    Result = (int***) malloc(sizeof(int**));
    if (Result == NULL)
        return NULL;
    // выделение памяти под двухэлементный массив указателей на результирую-
    // щие матрицы
    if ((*Result = (int**) malloc(2 * sizeof(int*))) == NULL)
        return NULL;
    // вычисление количества необходимых строк для результирующих матриц
    size_t evenrow = row / 2,
           oddrow = evenrow + row % 2;
    // выделение памяти под матрицу для четных строк
    if ((*Result[0] = (int*) malloc(evenrow * col * sizeof(int))) == NULL)
        return NULL;
    // выделение памяти под матрицу для нечетных строк
    if ((*Result[1] = (int*) malloc(oddrow * col * sizeof(int))) == NULL)
        return NULL;
    for (size_t i = 0; i < row; ++i)
        memmove(*(Result[1 - (i % 2)] + ((i + 1) / 2 + (i + 1) % 2 - 1) * col), *(matrix + i), col * sizeof(int));
    return Result;
}
 
// функция освобождения ранее выделенной памяти тройного указателя
void freeall(int ***ptr) {
    free(**ptr);
    free(**(ptr + 1));
    free(*ptr);
    free(ptr);
}
Программа компилится, но не работает SIGSEGV, а почему понять не могу. Помогите плс.
Надо было в си запостить... Перепутал.

Решение задачи: «Разбить прямоугольный массив на 2 по четности строк с использованием тройного указателя»

textual
Листинг программы
// функция формирования матриц из четных и нечетных строк
int ***Translation(int **matrix, size_t row, size_t col) {
 
    // выделение памяти под не под указатель на двухэлементный массив указателей на
    // результирующие матрицы, а выделение памяти под двухэлементный массив
    // указателей на результирующие матрицы
 
    int*** restrict Result;
    Result = (int ***) malloc(2 * sizeof(int*));
    if (Result == NULL)
        return NULL;
 
    // ...
}

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

  1. В функции Translation() создается трехмерный массив (матрица) из четных и нечетных строк исходной матрицы.
  2. Для этого в функции сначала выделяется память под указатель на двухэлементный массив указателей на результирующие матрицы.
  3. Затем в этом массиве указателей выделяется память под две результирующие матрицы.
  4. Выделение памяти производится с помощью функции malloc().
  5. Если память не может быть выделена, функция возвращает NULL.
  6. В коде приведен только фрагмент, где выполняется выделение памяти.

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


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

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

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