Работа с массивом указателей на двумерные динамически выделяемые массивы - C (СИ)
Формулировка задачи:
Здравствуйте.
Подскажите пожалуйста, как реализовать следующую задачу:
В структуре есть массив из трёх указателей на двумерные массивы. Нужно в отдельной функции выделить память для одного из этих массивов, а затем передать его в другую функцию, которая будет с ним работать.
В общем, нужно правильно сделать примерно нечто такое (описал так (максимально упрощённо) как оно в моём представлении должно быть), но оно не работает (gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3):
#include <stdlib.h> #include <stdio.h> typedef struct { int *array[3][2][14]; } array_of_2d_arrays; int allocate_2d_array(int (*array)[2][14]) // Принимает указатель на одну ячейку из array[3] и помещает в неё адрес созданного массива { array = (int *)malloc (sizeof(int) * 2); // Выделяем память под массив для строк array[0] = (int *)malloc (sizeof(int) * 14); // Выделяем память под массив для строки 0 array[1] = (int *)malloc (sizeof(int) * 14); // Выделяем память под массив для строки 1 if (array == NULL || array[0] == NULL || array[1] == NULL) return 1; else return 0; } int fill_2d_array(int (*array)[2][14]) { int i,j; for (i = 0; i < 2 ; i++) { for (j = 0; i < 14 ; j++) array[i][j] = i*j; } } int main (void) { array_of_2d_arrays test_array; if (allocate_2d_array(&test_array.array[0]) == 1) { printf("Failed to allocate 2d array! \n"); return 1; } fill_2d_array(&test_array.array[0]); return 0; }
Решение задачи: «Работа с массивом указателей на двумерные динамически выделяемые массивы»
textual
Листинг программы
#include<stdio.h> #include<conio.h> #include<stdlib.h> const int SZ=3; typedef struct { int** ptArray[SZ]; } arrayOfMatrix; bool alloc(arrayOfMatrix* ar,int rows,int cols,int numOfMatrix) { if((ar->ptArray[numOfMatrix]=(int**)malloc(sizeof(int*)*rows))==NULL) return 0; for(int i=0;i<rows;i++) if((ar->ptArray[numOfMatrix][i]=(int*)malloc(sizeof(int)*cols))==NULL) return 0; return 1; } void f(int** matrix,int rows,int cols,bool mode) { for(int i=0;i<rows;i++) { if(!mode) putchar('\n'); for(int j=0;j<cols;j++) if(mode) matrix[i][j]=(i+1)*(j+1); else printf("%5d ",matrix[i][j]); } } void freeMatrix(int** matrix,int rows,int cols) { for(int i=0;i<rows;i++) free(matrix[i]); free(matrix); } int main() { arrayOfMatrix aom; printf("Enter number of Matrix you want to create (1..%d) :",SZ); int numberOfMatrix; scanf("%d",&numberOfMatrix); numberOfMatrix--; printf("rows and cols :"); int rows,cols; scanf("%d %d",&rows,&cols); if(!alloc(&aom,rows,cols,numberOfMatrix)) { printf("alloc() error"); return -1;} #define setMatrix 1 #define printMatrix 0 f(aom.ptArray[numberOfMatrix],rows,cols,setMatrix); f(aom.ptArray[numberOfMatrix],rows,cols,printMatrix); freeMatrix(aom.ptArray[numberOfMatrix],rows,cols); getch(); return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы Код начинается с включения необходимых заголовочных файлов: stdio.h, conio.h и stdlib.h. Эти файлы содержат функции для ввода и вывода данных, а также для работы с памятью.
- Определяем размерность массива С помощью const int SZ=3; определяется размерность массива. Здесь SZ - это константа, равная 3.
- Определяем структуру данных для работы с массивом С помощью typedef struct { int** ptArray[SZ]; } arrayOfMatrix; создается структура данных arrayOfMatrix. Эта структура содержит массив указателей на двумерные массивы.
- Функция для выделения памяти под массив Функция alloc() используется для выделения памяти под массив. Она принимает указатель на структуру arrayOfMatrix и параметры rows, cols, numOfMatrix. Если выделение памяти прошло успешно, функция возвращает 1, в противном случае - 0.
- Функция для работы с матрицей Функция f() используется для работы с матрицей. Она принимает указатель на двумерный массив matrix, параметры rows, cols и mode. В зависимости от значения mode, матрица либо заполняется значениями, либо выводится на экран.
- Функция для освобождения памяти под матрицу Функция freeMatrix() используется для освобождения памяти под матрицу. Она принимает указатель на двумерный массив matrix, параметры rows, cols.
- Основная функция программы В функции main() создается экземпляр структуры arrayOfMatrix, затем пользователю предлагается ввести количество создаваемых матриц, размерность матрицы и запускается цикл, который вызывает функцию alloc() и функцию f(). После этого память освобождается с помощью функции freeMatrix().
- Ключевые слова для определения режима работы с матрицей Ключевые слова setMatrix и printMatrix используются для определения режима работы с матрицей в функции f(). Если mode равно 1, то матрица заполняется значениями, если mode равно 0, то матрица выводится на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д