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

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

  1. Включаем необходимые заголовочные файлы Код начинается с включения необходимых заголовочных файлов: stdio.h, conio.h и stdlib.h. Эти файлы содержат функции для ввода и вывода данных, а также для работы с памятью.
  2. Определяем размерность массива С помощью const int SZ=3; определяется размерность массива. Здесь SZ - это константа, равная 3.
  3. Определяем структуру данных для работы с массивом С помощью typedef struct { int** ptArray[SZ]; } arrayOfMatrix; создается структура данных arrayOfMatrix. Эта структура содержит массив указателей на двумерные массивы.
  4. Функция для выделения памяти под массив Функция alloc() используется для выделения памяти под массив. Она принимает указатель на структуру arrayOfMatrix и параметры rows, cols, numOfMatrix. Если выделение памяти прошло успешно, функция возвращает 1, в противном случае - 0.
  5. Функция для работы с матрицей Функция f() используется для работы с матрицей. Она принимает указатель на двумерный массив matrix, параметры rows, cols и mode. В зависимости от значения mode, матрица либо заполняется значениями, либо выводится на экран.
  6. Функция для освобождения памяти под матрицу Функция freeMatrix() используется для освобождения памяти под матрицу. Она принимает указатель на двумерный массив matrix, параметры rows, cols.
  7. Основная функция программы В функции main() создается экземпляр структуры arrayOfMatrix, затем пользователю предлагается ввести количество создаваемых матриц, размерность матрицы и запускается цикл, который вызывает функцию alloc() и функцию f(). После этого память освобождается с помощью функции freeMatrix().
  8. Ключевые слова для определения режима работы с матрицей Ключевые слова setMatrix и printMatrix используются для определения режима работы с матрицей в функции f(). Если mode равно 1, то матрица заполняется значениями, если mode равно 0, то матрица выводится на экран.

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


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

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

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