Как изменить содержимое 2d массива в C? - PullRequest
0 голосов
/ 11 апреля 2019

Я работаю над проблемой, где я должен транспонировать матрицу. Я передаю адрес исходной матрицы, но после выполнения функции она не меняется!

Я попытался добавить * infront матрицы в функцию транспонирования, думая, что она будет указывать на весь 2-мерный массив, но это не сработало.

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

void transpose(int *r,int *c, int **matrix);
void printMatrix(int r,int c, int **matrix){
  for(int i=0;i<r;i++){
      for(int j=0;j<c;j++)
        printf("%2d ",matrix[i][j]);
      printf("\n");  
  }
}

int main() {

  int **matrix;
  int r =3;
  int c =2;
  matrix = (int**) malloc(r*sizeof(int*)); 
  for(int i=0;i<r;i++)
    matrix[i] = (int*) malloc(c*sizeof(int));

   for(int i=0;i<r;i++){
      for(int j=0;j<c;j++)
        matrix[i][j] = (3*i+2*j)%8+1; 
  }
  printf("Before transpose:\n");
  printMatrix(r,c,matrix);

   transpose(&r, &c ,matrix);

  printMatrix(r,c,matrix);



return 0;
}

void transpose(int *r,int *c, int **matrix){
  int newR = *c;
  int newC = *r;
  int **newMatrix;

  newMatrix = (int**) malloc(newR*(sizeof(int*)));
  for(int i=0; i<newR;i++)
    newMatrix[i] = (int*) malloc(newC*(sizeof(int)));
  for(int i=0; i<newR; i++)
    for(int j=0;j<newC;j++)
      newMatrix[i][j] = matrix[j][i];

  *c = newC;
  *r = newR;



  matrix = (int**) malloc((*r)*sizeof(int*)); 
  for(int i=0;i<*r;i++)
    matrix[i] = (int*) malloc((*c)*sizeof(int));
  for(int i=0; i<newR; i++){
    for(int j=0;j<newC;j++){
      matrix[i][j] = newMatrix[i][j];
    }
 printf("\n");  
  }
}

У меня есть эта матрица

1 3
4 6
7 1

и хочу получить

1 4 7 
3 6 1

однако я получаю

1 3 0
1 4 0

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

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

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

int** transpose(int *r,int *c, int **matrix);

void printMatrix(int r, int c, int **matrix) {
    for (size_t i = 0; i < r; ++i){
        for (size_t j = 0; j < c; ++j) {
            printf("%2d ",matrix[i][j]);
        }

        printf("\n");  
    }
}

int main()
{
    int r = 3;
    int c = 2;

    int **matrix = calloc(sizeof(int*), r);

    for (size_t i = 0; i < r; ++i) {
        matrix[i] = calloc(sizeof(int), c);
    }

    for (size_t i = 0; i < r; ++i) {
        for (size_t j = 0; j < c; ++j) {
            matrix[i][j] = (3 * i + 2 * j) % 8 + 1; 
        }
    }

    printf("Before transpose:\n");
    printMatrix(r, c, matrix);

    int** newMatrix = transpose(&r, &c ,matrix);

    printMatrix(r, c, newMatrix);

    return EXIT_SUCCESS;
}

int** transpose(int *r, int *c, int **matrix) {
    int newR = *c;
    int newC = *r;

    int **newMatrix = calloc((sizeof(int*)), newR);

    for (size_t i = 0; i < newR; ++i) {
        newMatrix[i] = (int*) malloc(newC*(sizeof(int)));
    }

    for (size_t i = 0; i < newR; ++i) {
        for (size_t j = 0; j < newC; ++j) {
            newMatrix[i][j] = matrix[j][i];
        }
    }

    *c = newC;
    *r = newR;

    matrix = calloc(sizeof(int*), *r); 

    for (size_t i = 0; i < *r; ++i) {
        matrix[i] = calloc(sizeof(int), *c);
    }

    for (size_t i = 0; i < newR; ++i) {
        for (size_t j = 0; j < newC; ++j) {
            matrix[i][j] = newMatrix[i][j];
        }

        printf("\n");  
    }

    return newMatrix;
}

Выход:

1 4 7
3 6 1

Я изменил несколько вещей, особенно потому, что я предпочитаю использовать calloc вместо malloc, поскольку он обнуляет вновь выделенную память, и есть специальный параметр для размера запрошенной памяти, который я считаю семантически это лучшая идея.

В качестве примечания: вам не нужно приводить результат malloc в C. Я, как мне кажется, склонен чувствовать это сильнее, чем другие люди, потому что кодовый шум, особенно когда вы работаете в С - одна из худших вещей, которые вы можете сделать для себя. Это довольно хороший пример этого, так как все, что я сделал, это переформатировал ваш код, и ответ был тут же. Не скупитесь на пробелы; это действительно имеет значение.

В любом случае, я надеюсь, что это чем-то помогло, даже если у вас в буквальном смысле все было сделано.

0 голосов
/ 11 апреля 2019
#include<stdio.h>
#include <stdlib.h>

void transpose(int *r,int *c, int ***matrix);
void printMatrix(int r,int c, int **matrix){
    int i=0,j=0;
  for(i=0;i<r;i++){
      for(j=0;j<c;j++)
        printf("%2d ",matrix[i][j]);
      printf("\n");  
  }
}

int main() {

  int **matrix;
  int r =3;
  int c =2;
  int i=0,j=0;

  matrix = (int**) malloc(r*sizeof(int*)); 
  for(i=0;i<r;i++)
    matrix[i] = (int*) malloc(c*sizeof(int));

   for(i=0;i<r;i++){
      for(j=0;j<c;j++)
        matrix[i][j] = (3*i+2*j)%8+1; 
  }
  printf("Before transpose:\n");
  printMatrix(r,c,matrix);

   transpose(&r, &c, &matrix);

  printMatrix(r,c,matrix);



return 0;
}

void transpose(int *r,int *c, int ***matrix){
  int newR = *c;
  int newC = *r;
  int **newMatrix;
  int i=0,j=0;

  newMatrix = (int**) malloc(newR*(sizeof(int*)));
  for(i=0; i<newR;i++)
    newMatrix[i] = (int*) malloc(newC*(sizeof(int)));
  for(i=0; i<newR; i++)
    for(j=0;j<newC;j++) {
      newMatrix[i][j] = (*matrix)[j][i];
    }

  *c = newC;
  *r = newR;

  // free matrix..

  *matrix = newMatrix;


  /*matrix = (int**) malloc((*r)*sizeof(int*)); 
  for(i=0;i<*r;i++)
    matrix[i] = (int*) malloc((*c)*sizeof(int));
  for(i=0; i<newR; i++){
    for(j=0;j<newC;j++){
      matrix[i][j] = newMatrix[i][j];
    }
 printf("\n");  
  }*/

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...