Работа с массивом указателей на двумерные динамически выделяемые массивы - 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, то матрица выводится на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д