2014-10-06 135 views
0

我有這個錯誤,但我相信我有相同的數據類型,我沒有做任何錯誤,我想。它用於計算矩陣的行列式。有人幫忙。我實在想不出爲什麼我有這樣的錯誤:(錯誤:無法將參數'1'轉換爲'int(*)[(((sizetype)(((ssizetype)n)+ -1))+ 1)]'''int(*)[100] int determine(int(*)[100],int)'|

#include <iostream> 
#include <stdio.h> 
#include <cmath> 
using namespace std; 

double determinant(double matrix[100][100], int order) 
{ 
    double det, temp[100][100]; int row, col; 

    if (order == 1) 
     return matrix[0][0]; 
    else if (order == 2) 
     return ((matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0])); 
    else 
    { 
     for (int r = 0; r < order; r++) 
     { 
      row = 0; 
      col = 0; 
      for (int i = 1; i < order; i++) 
      { 
       for (int j = 0; j < order; j++) 
       { 
        if (j == r) 
         continue; 

        temp[row][col] = matrix[i][j]; 
        col++; 
       } 
       row++; 
      } 
      det += (matrix[0][r] * pow(-1, r) * determinant(temp, order - 1)); 
     } 
     return det; 
    } 
} 


int main() 
{ 
    int n; 
    cout << "Enter the dimension: "; 
    cin >> n; 
    double elem[n][n]; 

    for (int i = 0; i < n; i++) 
    { 
     cout << "Enter row " << i << ": "; 
     for (int j = 0; j < n; j++) 
     { 
      cin >> elem[i][j]; 
     } 
     cout << endl; 
    } 

    cout << determinant(elem, n); 
    return 0; 
} 
+0

我剛剛回答了一個類似的問題。請看http://stackoverflow.com/a/26210551/434551 – 2014-10-06 06:09:42

+0

非常感謝你! – Jessie 2014-10-06 06:19:08

+0

您將不會獲得該功能。考慮重寫整個程序而不遞歸。 – Lundin 2014-10-06 06:21:54

回答

1

double elem[n][n];在C++中是非法的。數組必須在編譯時已知的尺寸。

您離奇的錯誤消息是編譯器的嘗試結果支持double elem[n][n]作爲一個擴展,但沒有做它的一個很好的工作。

一種方法來解決,這將是改變你的代碼double elem[100][100];

要修復它不浪費備忘錄ry並堅持使用標準C++,則應該使用std::vector而不是C風格的數組。編碼使用矢量矢量更簡單,但出於性能原因,您可能需要使用一維矢量。

此外,您需要稍微重構determinant,因爲您每次執行遞歸的另一步時都不想分配新內存。函數determinant需要知道分配的內存維度以及要計算行列式的維度。

1

你的原型是 雙行列式(雙矩陣[100] [100],INT順序)

和你 決定(ELEM,n)的調用它; 當 雙elem [n] [n];這是一個「動態」數組大小所以不是100×100

它接縫編譯器假定n是1在編譯時間,以便 明顯雙陣列[1] [1]不能被轉換爲[100] [100]

即使您的輸入矩陣數據爲1x1,您也必須將其存儲在100x100陣列中。 只聲明雙elem [100] [100]; 終於在運行時確保用戶輸入n < 100以避免錯誤

1

您有三個問題。

首先,elem的大小在編譯時是未知的。如果你真的想要堆棧中的變量和矩陣的大小真的是100x100,你應該使用elem [100] [100]。

其次,您的行列式函數在堆棧上創建了10萬個元素矩陣,並且它是遞歸的,這意味着您將獲得很多元素並可能耗盡堆棧空間。您應該考慮使用單個臨時矩陣並將其重複用於每個遞歸步驟。

第三,因爲你需要矩陣大小它是動態的,所以在堆中聲明它。喜歡的東西:

double* elem = new double[n * n]; 

嚴格地說你不需要這麼做,但如果你正在計算小矩陣的行列式也不會浪費這麼多的內存爲100×100矩陣。

如果使用一維數組,則可以將任意大小的數組傳遞給行列式(行列式函數也應該採用一維數組或double *而不是double [100] [100])。您必須使用矩陣[order * j + i]自己計算索引。