Установка значений динамически размещаемого массива - PullRequest
0 голосов
/ 28 мая 2019

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

Когда я пытаюсь установить значения, у меня выводится неправильно.

Matrix Struct

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

matrix_t our_matrix[MAX_MATRICES];

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

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 * data = (float *) malloc(rows * cols * sizeof(float));  

  int row = 0, col = 0;
  for (row = 1; row <= rows; row++) {
    for (col = 1; col <= cols; col++) {

      data[(row-1) + (col-1) * cols] = 0;
    }
  }

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

  return 0;

}

Значения:

int setValues(matrix_t* our_matrix, int number_of_matrices) {
  int i, matrix_index;
  for(i = 0; i < number_of_matrices; i++){
    printf("Matrix %i\t %i Rows\t %i Columns - Name: %s\n", i+1, our_matrix[i].rows, our_matrix[i].columns, our_matrix[i].matrixName);
  }

  printf("\nWhich matrix would you like to set the values for?\n");
  printf("Select a matrix number from the list above>\n");

  scanf("%d", &matrix_index);

  while(matrix_index < 1 || matrix_index > number_of_matrices){
    printf("Enter a number from the list of available matrices - number must be greater than zero and less than or equal to the number of available matrices:\n");
    scanf("%d", &matrix_index);
  }

  int max;
  matrix_index -= 1;
  max = our_matrix[matrix_index].columns;


  float *data = our_matrix[matrix_index].data;
  int row = 0, col = 0;
  for (row = 0; row < our_matrix[matrix_index].rows; row++) {
    for (col = 0; col < our_matrix[matrix_index].columns; col++) {

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

Когда я пытаюсь вызвать setValues ​​для матрицы 5 x 2, и я даю ей значения 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, это значения, которые я получаю:

enter image description here

Честно говоря, я не могу понять, как он хранит эти значения, а не 1:10, который я передаю.

1 Ответ

2 голосов
/ 28 мая 2019

У вас есть небольшая путаница в вычислении адресов: вы перевернули row и col в умножении.

Вы пишете (я заменил max его значением) в setValues

scanf("%f", &data[(row) + (col) * (our_matrix[matrix_index].columns)]);

то же самое в create_matrix функции:

data[(row-1) + (col-1) * cols] = 0;

Вы должны были написать:

scanf("%f", &data[(col) + (row) * (our_matrix[matrix_index].columns)]); 

и

data[(col-1) + (row-1) * cols] = 0;

Вы можете сделать математику, чтобы убедиться:

Если rows равно 2, а cols равно 10, по вашему методу максимальный индекс равен 2 + 9 * 10 = 90, это слишком велико для матрицы 2x10.


Еще одна вещь:

Функция create_matrix может быть упрощена:

int create_matrix(matrix_t* matrixP, int matrixLocation){

  int rows, cols;

  printf("Enter a name for your matrix>\n");
  /* Warning, you should test what scanf returned! */
  scanf("%s", matrixP[matrixLocation].matrixName);

  printf("Enter the number of rows>\n");
  /* Warning, you should test what scanf returned! */
  scanf("%d", &rows);  

  printf("Enter the number of cols>\n");
  /* Warning, you should test what scanf returned! */
  scanf("%d", &cols);

  matrixP[matrixLocation].rows = rows;
  matrixP[matrixLocation].cols = cols;

  /* Warning, you should test what calloc returned! */
  matrixP[matrixLocation].data = calloc(rows * cols, sizeof(float));  

  return 0;

}
...