Реарганизация программы для передачи массивов в функции Си

#include <stdio.h>
#include <stdlib.h>

#define COL_ARR 100
#define ROW_ARR 100

void output(int *arr, int collumn, int row);
void output1(int **arr, int collumn, int row);
int inputType(int * type);
int inputRowCol(int *collumn, int *row);
int createStaticMatrix(int *arr, int collumn, int row);
int createDinamicMatrix1(int ***arr, int collumn, int row);
int createDinamicMatrix2(int ***arr, int collumn, int row);
int createDinamicMatrix3(int ***arr, int collumn, int row);

int main(void) {
  int **dinamicArr = NULL;
  int collumn = 0, row = 0;
  int typeCase = 0;

  if (inputType(&typeCase) && inputRowCol(&collumn, &row)) {
    int staticArr[ROW_ARR][COL_ARR];
    if (typeCase == 1 && createStaticMatrix((int *)staticArr, collumn, row)) {
      output((int *)staticArr, collumn, row);
    } else if (typeCase == 2 && createDinamicMatrix1(&dinamicArr, collumn, row)) {
      output1(dinamicArr, collumn, row);
      free(dinamicArr);
    } else if (typeCase == 3 && createDinamicMatrix2(&dinamicArr, collumn, row)) {
      output1(dinamicArr, collumn, row);
      for (int i = 0; i < row; ++i) {
        free(dinamicArr[i]);
      }
      free(dinamicArr);
    } else if (typeCase == 4 && createDinamicMatrix3(&dinamicArr, collumn, row)) {
      output1(dinamicArr, collumn, row);
      free(dinamicArr[0]);
      free(dinamicArr);
    } else {
    printf("n/a");
    }
  } else {
    printf("n/a");
  }
  return 0;
}

void output(int *arr, int collumn, int row) {
  for (int i = 0; i < row; ++i) {
    for (int j = 0; j < collumn; ++j) {
      if (j < collumn - 1) {
        printf("%d ", *(arr + collumn * i + j));
      } else {
        printf("%d", *(arr + collumn * i + j));
      }
    }
    printf("\n");
  }
}

void output1(int **arr, int collumn, int row) {
  for (int i = 0; i < row; ++i) {
    for (int j = 0; j < collumn; ++j) {
      if (j < collumn - 1) {
        printf("%d ", arr[i][j]);
      } else {
        printf("%d", arr[i][j]);
      }
    }
    printf("\n");
  }
}

int inputType(int *type) {
  int flag = 1;
  char check = '\0';
  if (scanf("%d%c", type, &check) != 2 || check != '\n' || (*type <= 0 || *type > 4)) {
    flag = 0;
  }
  return flag;
}

int inputRowCol(int *collumn, int *row) {
  int flag = 1;
  char check = '\0';
  if (scanf("%d %d%c", row, collumn, &check) != 3 || check != '\n' || (*row < 1 && *collumn < 1)) {
    flag = 0;
  }
  return flag;
}

int createStaticMatrix(int *arr, int collumn, int row) {
  int flag = 1;
  for (int i = 0; i < row; ++i) {
    for (int j = 0; j < collumn; ++j) {
      if (scanf("%d", &arr[collumn * i + j]) != 1) {
        flag = 0;
      }
    }
  }
  return flag;
}

int createDinamicMatrix1(int ***arr, int collumn, int row) {
  int flag = 1;
  *arr = malloc(collumn * row * sizeof(int) + row * sizeof(int *));
  int *ptr = (int *)(*arr + row);
  for (int i = 0; i < row; ++i) {
    (*arr)[i] = ptr + collumn * i;
  }

  for (int i = 0; i < row; ++i) {
    for (int j = 0; j < collumn; ++j) {
      if (scanf("%d", &(*arr)[i][j]) != 1) {
        flag = 0;
      }
    }
  }
  return flag;
}

int createDinamicMatrix2(int ***arr, int collumn, int row) {
  int flag = 1;
  *arr = malloc(row * sizeof(int *));
  for (int i = 0; i < row; ++i) {
    (*arr)[i] = malloc(collumn * sizeof(int));
  }

  for (int i = 0; i < row; ++i) {
    for (int j = 0; j < collumn; ++j) {
      if (scanf("%d", &(*arr)[i][j]) != 1) {
        flag = 0;
      }
    }
  }
  return flag;
}

int createDinamicMatrix3(int ***arr, int collumn, int row) {
  int flag = 1;
  *arr = malloc(row * sizeof(int *));
  int *valuesArray = malloc(collumn * row * sizeof(int));
  for (int i = 0; i < row; ++i) {
    (*arr)[i] = valuesArray + collumn * i;
  }

  for (int i = 0; i < row; ++i) {
    for (int j = 0; j < collumn; ++j) {
      if (scanf("%d", &(*arr)[i][j]) != 1) {
        flag = 0;
      }
    }
  }
  return flag;
}

Как реорганизовать программу,чтобы лучше понять передачу массивов по указателям. Может есть способы попроже и попонятней?


Ответы (0 шт):