C - Печать элементов 2d массива внутри массива struct - PullRequest
0 голосов
/ 24 мая 2019

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

По какой-то причине в моей текущей реализации, если я создаю матрицу 3x3 и устанавливаю каждое значение на число 5, она печатает значения, но печатает их, считая с 5, поэтому печатает 567, 678, 789 , когда вместо этого я хочу напечатать точное значение, которое я установил.

Вот определения функций - что я делаю не так?

Определение структуры:

    struct matrix{
        char matrixName[50];
        int rows;
        int columns;
        float* data;
    };
    typedef struct matrix matrix_t;

Создание матрицы:

int create_matrix(matrix_t* matrixP, int matrixLocation){

  char tempName[50];
  int rows, cols;


  printf("Enter a name for your matrix>\n");
  scanf("%s", tempName);

  printf("Enter the number of rows>\n");
  scanf("%d", &rows);

  printf("Enter the number of cols>\n");
  scanf("%d", &cols);

  float * our_matrix = (float *) malloc(rows * cols * sizeof(float));  

  strcpy(matrixP[matrixLocation].matrixName, tempName);
  matrixP[matrixLocation].rows = rows;
  matrixP[matrixLocation].columns = cols;
  matrixP[matrixLocation].data = our_matrix;

  return 0;

}

Заданные значения:

int setValues(matrix_t* our_matrix, int matrix_index) {
  int counter = 0;
  int row = 0, col = 0;
  for (col = 1; col <= our_matrix[matrix_index].columns; col++) {
    for (row = 1; row <= our_matrix[matrix_index].rows; row++) {
      counter++;

      printf("Enter the value for column number %d of row number %d>\n", col, row);
      scanf("%f", our_matrix[matrix_index].data+(col-1)+(row-1));                
    }
    /* separate rows by newlines */
  }
    return 0;
}

Печать:

int printMatrix(matrix_t* our_matrix, int index) {
      int row = 0, col = 0;
      for (col = 1; col <= our_matrix[index].columns; col++) {
        for (row = 1; row <= our_matrix[index].rows; row++) {
      printf(" %2.f ", *our_matrix[index].data+(col-1)+(row-1));   
    }
    printf("\n");
  }
    return 0;
}

Если я вызываю функцию printMatrix() без предварительного использования setValues, кажется, что она печатает относительную позицию ячейки, которую она печатает, примерно так:

enter image description here

Но когда я звоню setValues() и устанавливаю все значения на номер 5, его отпечатки отсчитываются от номера 5 следующим образом:

enter image description here

1 Ответ

1 голос
/ 24 мая 2019

Ваш расчет позиции неверен.Существует одна проблема и одна проблема «условного обозначения».

Проблема заключается в вычислении индексов массива:

scanf("%f", our_matrix[matrix_index].data+(col-1)+(row-1));
printf(" %2.f ", *our_matrix[index].data+(col-1)+(row-1));

Вам необходимо умножить значение (row - 1) на our_matrix[matrix_index].cols.Вам, вероятно, будет лучше с некоторыми более короткими именами для значений:

int max_col = our_matrix[matrix_index].columns;
int max_row = our_matrix[matrix_index].rows;
float *data = our_matrix[matrix_index].data;

for (col = 1; col <= max_col; col++)
{
    for (row = 1; row <= max_row; row++)
    {
        printf("Enter the value for column number %d of row number %d>\n", col, row);
        if (scanf("%f", data + (col-1) + (row-1) * max_col) != 1)
        {
            …report error and do not continue…
        }
    }
}

for (col = 1; col <= max_col; col++)
{
    for (row = 1; row <= max_row; row++)
        printf(" %.2f", data[(col-1) + (row-1) * max_col]);
    putchar('\n');
}

Это касается существенной ошибки.Обратите внимание на проверку ошибок на scanf().Это важно в программах «реального мира» (даже если вы обходитесь без него на уроках или в онлайн-конкурсах).Вы могли бы разумно использовать нотацию &data[(col-1) + (row-1) * max_cols] вместо data + (col-1) + (row-1) * max_cols при вызове scanf() тоже - это улучшило бы согласованность кода.

Проблема «условной нотации» заключается в том, что в C,Индексирование массива начинается с 0, а не с 1, и вы можете избежать множества терминов -1, следуя соглашениям C.Этот фрагмент также объявляет переменные цикла, когда они необходимы, минимизируя их объем.Это особенность C начиная с C99 - она ​​может быть недоступна на некоторых ретроградных (но популярных и распространенных) платформах.

for (int col = 0; col < max_col; col++)
{
    for (int row = 0; row < max_row; row++)
        printf(" %.2f", data[col + row * max_col]);
    putchar('\n');
}
...