2013-03-19 139 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