Работа с массивом указателей на двумерные динамически выделяемые массивы - 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, то матрица выводится на экран.