Попытка изменить элемент в 2D массиве в C - PullRequest
0 голосов
/ 01 февраля 2019

Я предполагаю реализовать в функции make2Darray, чтобы элементы в двумерном массиве соответствовали номеру строки.

Другие части кода, которые печатаются и освобождаются, уже были заданы, поэтому нет необходимостибеспокоиться об этом.Я только полагаю, чтобы коснуться функции make2Darray.Однако в этой функции была также выделена часть распределения.Поэтому единственный код, который я должен изменить, - это часть, в которой я изменяю элементы в массиве 2D.

int** make2Darray(int width, int height) {
  int **a;
  int i = 0;
  int j = 0;

  /*allocate memory to store pointers for each row*/
  a = (int **)calloc(height, sizeof(int *));
  if(a != NULL) {
    /* allocate memory to store data for each row*/
    for(i = 0; i < height; i++) {
      a[i] = (int *)calloc(width, sizeof(int));
      if(a[i] == NULL) {
        /* clean up */
        free2Darray(a, height);
        return NULL; /*aborting here*/
      }
    }
  }
    /* from this point down is the part I implemented, all code above was 
    given*/
    if (height < 0 && width < 0) {
      for (i = 0; i < height; i++) {
        for (j = 0; j < width; j++) {
          a[i][j] = j;
        }
      }
    }
    return a;
}

Предполагается, что элементы в массиве 2D соответствуют номеру строки, если высота = 4 и ширина= 3

0  0  0
1  1  1
2  2  2
3  3  3

Тем не менее, я всегда получаю 0, которые были настройкой по умолчанию, когда я получал код

0  0  0
0  0  0
0  0  0
0  0  0

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

У вас есть две основные проблемы в коде.

1) Код, в котором вы инициализируете 2D-массив, должен быть внутри блок if

2) if (height < 0 && width < 0) { неверно - вы хотите > вместо <

Попробуйте:

int** make2Darray(int width, int height) {
  int **a;
  int i = 0;
  int j = 0;

  /*allocate memory to store pointers for each row*/
  a = (int **)calloc(height, sizeof(int *));
  if(a != NULL) {
    /* allocate memory to store data for each row*/
    for(i = 0; i < height; i++) {
      a[i] = (int *)calloc(width, sizeof(int));
      if(a[i] == NULL) {
        /* clean up */
        free2Darray(a, height);
        return NULL; /*aborting here*/
      }
    }

    // Moved inside the if(a != NULL) {

    /* from this point down is the part I implemented, all code above was 
    given*/
    if (height > 0 && width > 0) {   // Corrected this part 
      for (i = 0; i < height; i++) {
        for (j = 0; j < width; j++) {
          a[i][j] = j;
        }
      }
    }

  }
  return a;
}

Несколько подсказок:

1) Выполните проверку высоты иширина в начале вашей функции - как:

if (height <= 0 || width <= 0) return NULL;

2) Прототип make2Darray(int width, int height) кажется мне обратным, поскольку мы обычно упоминаем число строк перед числом столбцов.Я бы предпочел: make2Darray(int height, int width).Я даже предпочитаю термин «строка» вместо «высота» и «столбец» вместо «ширина».

3) Ваш текущий код выполняет «все реальные вещи» внутри if(a != NULL) { Это нормально, но кодбыло бы (для меня) более понятным, если бы вы вместо этого сделали if(a == NULL) return NULL;

4) Нет необходимости разыгрывать calloc

С этими обновлениями код может быть:

int** make2Darray(int rows, int columns) {
  int **a;
  int i = 0;
  int j = 0;

  if (rows <= 0 || columns <= 0) return NULL;
  a = calloc(rows, sizeof(int*));
  if(a == NULL) return NULL;

  /* allocate memory to store data for each row*/
  for(i = 0; i < rows; i++) {
      a[i] = calloc(columns, sizeof(int));
      if(a[i] == NULL) {
        /* clean up */
        free2Darray(a, rows);
        return NULL; /*aborting here*/
      }
  }

  /* from this point down is the part I implemented, all code above was 
     given*/
  for (i = 0; i < rows; i++) {
      for (j = 0; j < columns; j++) {
          a[i][j] = j;
      }
  }

  return a;
}
0 голосов
/ 01 февраля 2019

В вашем коде проверка if кажется неуместной.

  if(a != NULL) {
    /* allocate memory to store data for each row?
    for(i = 0; i < height; i++) {
      a[i] = (int *)calloc(width, sizeof(int));
      if(a[i] == NULL) {
        /* clean up */
        free2Darray(a, height);
        return NULL; /*aborting here*/
      }

Ну, это не имеет смысла.В случае успеха a предполагается не равным NULL.

Вы должны иметь чек на a == NULL и впоследствии return NULL;, а не наоборот.

Тем не менее:

  • if (height < 0 && width < 0) выглядит не очень хорошо.Скорее всего, это неправильно (в этом контексте использования) и неэффективно.
  • Весь доступ для a[i][j] недопустим.У вас просто есть место, выделенное для int * с, сами int * не указывают на какую-либо действительную память.Вам также необходимо выделить им память (например, используя width в качестве размера).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...