Разбить прямоугольный массив на 2 по четности строк с использованием тройного указателя - C (СИ)
Формулировка задачи:
Описание задачи: На базе заданной прямоугольной матрицы сделать 2, одна из которых содержит элементы, принадлежащие строкам с четными номерами, а вторая - с нечетными. Операцию реализовать как функцию, принимающую на вход двойной указатель на матрицу и ее размеры по каждому измерению. На выходе функция должна вернуть тройной указатель.
Программа компилится, но не работает SIGSEGV, а почему понять не могу. Помогите плс.
#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); }
Надо было в си запостить... Перепутал.
Решение задачи: «Разбить прямоугольный массив на 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; // ... }
Объяснение кода листинга программы
- В функции Translation() создается трехмерный массив (матрица) из четных и нечетных строк исходной матрицы.
- Для этого в функции сначала выделяется память под указатель на двухэлементный массив указателей на результирующие матрицы.
- Затем в этом массиве указателей выделяется память под две результирующие матрицы.
- Выделение памяти производится с помощью функции malloc().
- Если память не может быть выделена, функция возвращает NULL.
- В коде приведен только фрагмент, где выполняется выделение памяти.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д