2013-03-19 92 views
1

我被要求编写一个程序,该程序获取二维数组(矩阵),列数和行数,程序将返回转置矩阵(不使用[ ] [],意思是只使用指针算术)返回二维数组的问题

我写的程序确实转置矩阵,这是没问题的。我的问题是了解如何返回。这里是我的代码:

int** transpose_matrix(matrix mat1,int number_of_rows,int number_of_columns) 
{ 
    matrix mat2; 
    int row_index,column_index; 
    for(row_index=0;row_index<number_of_rows;row_index++) 
    { 
     for(column_index=0;column_index<number_of_columns;column_index++) 
      **(mat2+(column_index*number_of_rows)+row_index)=**(mat1+(row_index*number_of_columns)+column_index); 
    } 
    // at this point, mat2 is exactly the transpose of mat1 
    return mat2; 
} 

现在这里是我的问题:我不能返回一个矩阵,我能做的最接近的事是回到矩阵的第一个值的地址,但即使我做到这一点,所有的矩阵的其余部分将无法使用,只要我退出transpose_matrix函数回到void main ...我怎样才能返回mat2?

+3

@nhahtdh malloc不栈上分配空间。 – 2013-03-19 20:44:49

+0

@nhahtdh这是一个动态的堆。 – squiguy 2013-03-19 20:50:48

+0

想到堆,但写了堆栈。 #_# – nhahtdh 2013-03-19 22:30:02

回答

0

一,二维数组是而不是双指针。

二,动态分配。如果matrix是一个二维数组类型,然后写是这样的:

typedef int matrix[ROWS][COLUMNS]; 
typedef int (*matrix_ptr)[COLUMNS]; 

matrix_ptr transpose_matrix(matrix m, int rows, int cols) 
{ 
    matrix_ptr transposed = malloc(sizeof(*transposed) * rows); 
    // transpose, then 
    return transposed; 
} 
+0

@ qPCR4vir你为什么喊? – 2013-03-19 21:03:44

+0

不...我没有downvote! – qPCR4vir 2013-03-19 21:11:00

+0

无论如何,我想给你+1,但我想先看到“//转置,然后”部分。 – qPCR4vir 2013-03-19 21:13:05

0

确定:这里有3件事:

  1. 不能返回一个指针到一个局部变量(这将是返回后的垃圾 以及堆栈(内存)在哪里被重用)。
  2. 数组衰减时指向传递的第一个元素。
  3. 指针运算:p + 1通过sizeof(* p)递增p中的地址,所以 p指向下一个元素,而不指向下一个字节。

的简单的解决您的代码(这适用于任何矩阵大小):

int* transpose_matrix(int *mat1,int number_of_rows,int number_of_columns) 
    { 
     int *mat2=malloc(number_of_rows*number_of_columns*sizeof(int)); 
     int row_index,column_index; 
     for(row_index=0;row_index<number_of_rows;row_index++) 
     { 
      for(column_index=0;column_index<number_of_columns;column_index++) 
       mat2[column_index*number_of_rows+row_index]=mat1[row_index*number_of_columns+column_index]; 
     } 
     // at this point, mat2 is exactly the transpose of mat1 
     return mat2; 
    } 

... 
    print(m,r,c); // I hope you have a print() 
    int *t=transpose_matrix(m,r,c); 
    print (t,c,r); 
... 
    // use t[max: c-1][max: r-1] 
    free(t); 

如果我们只固定大小的矩阵(以及与C99,我们可以使用varable长数组呢!)。

typedef int Matrix[ROWS][COLUMNS]; 
typedef int TMatrix[COLUMNS][ROWS]; 
typedef int (*pMatrix)[COLUMNS]; 
typedef int (*pTMatrix)[ROWS]; 

pTMatrix transpose_matrix(Matrix m , int rows, int cols) 
{ 
    pTMatrix t = malloc(sizeof(*t)*cols); 
    for (int r=0; r<rows ; ++r) 
    for (int c=0; r<cols ; ++r) 
     t[c][r]=m[r][c]; 
    return t; 
} 

好吧,如果行列数是固定的,你不需要通过它....嗯...

+0

好吧,这似乎工作,但我现在有另一个问题,我需要打印转置矩阵,但你已经宣布m是一个指向一个整数,所以你已将2d数组转换为1d数组,我该如何打印转置矩阵? – 2013-03-19 21:56:28

+0

使用丑陋的索引像ptr [rows * column + row],:-( – qPCR4vir 2013-03-19 22:16:56

+0

我们可以做一些诡计。 – qPCR4vir 2013-03-19 22:17:39