0

呼び出しツリー: populateMatrix(coeff,bMatrix, rows,cols); solveMatrix(coeff, bMatrix, cols+1);

void solveMatrix(float aMatrix[][DEFCOLS+1],float bMatrix[DEFCOLS+1], size_t cols){
std::cout << "\nInside solveMatrix...: " << endl;
size_t N2 = cols;

std::cout << "\N2 is...: " << N2 << endl;
for(size_t p=0; p<N2; p++){
    //std::cout << "\nInside 1st for loop...: " << endl;
    // find pivot row and swap
    int max = p;
    for(size_t i=p+1; i<N2; i++){
        //std::cout << "\nInside 2nd for loop...: " << endl;
        if ( abs(aMatrix[i][p]) > abs(aMatrix[max][p]) ){
            max = i;
        }
    }

    //std::cout << "\nJust b4 all the swapping...: " << endl;

    float temp[] = { *aMatrix[p] };
    *aMatrix[p] = *aMatrix[max];

    *aMatrix[max] = *temp;

    float t = bMatrix[p];
    bMatrix[p] = bMatrix[max];


    bMatrix[max] = t;
    //std::cout << "\nDone all the swapping...: " << endl;

    if ( abs(aMatrix[p][p]) <= MINISCULE) {
        std::cout << "***** Error matrix value too small. Matrix is singular" << endl;
        return;
    }
    // Pivot /in A and b
    for(size_t i=p+1; i<N2; i++){
        float alpha = aMatrix[i][p] / aMatrix[p][p];

        bMatrix[i] = alpha * bMatrix[p];

        for(size_t j=p; j<N2; j++){
            aMatrix[i][j] -= alpha * aMatrix[p][j];
        }

    }

    std::cout << "\nAbout to do the back subst..: " << endl;
    // back subst.
     std::vector<float> outMatrix(N2, 0.0);
     int i =0;

    for(i=N2-1; i>=0; i--){
        float sum = 0.0;
        int j=0;
        for(j=i+1; j<N2; j++){
            sum += aMatrix[i][j] * outMatrix[j];
        }       
        if (aMatrix[i][i] > 0){
            outMatrix[i] =  ( bMatrix[i] - sum ) / aMatrix[i][i];
        }else {
            outMatrix[i] = 0.0;
        }
    }

    int g = 0;
    std::cout << "\nSolution: " << endl;
    for (;g < N2-1; g++) {
        cout << outMatrix[g] << " ";
    }
    cout << endl;
    return;
}  

} // solveMatrix() を終了します

これは、部分ピボットを使用したガウス消去法の実装です。アプリケーションが実行され、結果が返されます - 間違った結果が返されますが、返された後に以下のエラーが発生します。

呼び出しの先頭に戻るとすぐに、次のメッセージが表示されます。実行時チェックの失敗 #2 - bMatrix 周辺のスタックが壊れています!!!

私はこれを永遠に見てきましたが、なぜそうなのかわかりません。助けてください。ありがとう。

4

1 に答える 1

1

この問題は、solveMatrix() に渡す実際の行列サイズ (つまり、cols+1) が実際の配列 (coeff または bMatrix) のサイズよりも大きいために発生します。

これをデバッグする最も簡単な方法は次のとおりです。

  1. 関数の本体を完全にクリアします。エラー メッセージが表示されなくなったことを確認します。
  2. 最初の for() ループを復元します。これによりエラーが表示されるかどうかを確認します。
  3. ...
  4. 関数の正確な部分がエラーの原因であることがわかるまで、これを繰り返します。次に、注意深く調べて、配列の制限を超えていないことを確認します (つまり、bMatrix が float[16] の場合、bMatrix[16]、[17]、またはそれ以上を記述していません。
于 2012-07-10T15:40:37.767 に答える