0

他の人が行ったのと同じように、Microsoft Visual Studio 2010 でこのプログラムを実行しましたが、結果の製品マトリックスを確認すると、マトリックスの最初の行は正しいですが、マトリックスの下の他の 2 行は間違っています。

だから、この間違った行列を見ています

5.3 23.9 24
-9.25596e+061 56.3 60.2
416 497.1 2980.9

私のプログラムが見るべき正解/マトリックスは

5.3 23.9 24

11.6 56.3 58.2

17.9 88.7 92.4

私はこのmatrix1を掛けているので

1 2 3
4 5 6
7 8 9

このmatrix2によって

0 2 4

1 4.5 2.2

1.1 4.3 5.2

ここにコードがあります

// 
//
// 
//
//Purpose: program that multiplys two matrices

#include <iomanip>
#include <iostream>

using namespace std;



const int N = 3;

void multiplyMatrix(const double a[][N], const double b[][N], double c[][N]);


int main()
{
    const double matrix1[][N] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};               //matrix 1
    const double matrix2[][N] = {{0, 2, 4},{1, 4.5, 2.2},{1.1, 4.3, 5.2}};     //matrix 2

    double matrix[][N]= {0};

      multiplyMatrix(matrix1, matrix2, matrix);






     return 0;
}


void multiplyMatrix(const double a[][N], const double b[][N], double c[][N])
{
    for ( int i = 0; i < 3 ; i++)
    {
        for ( int j = 0; j < 3; j++)
        {
            for ( int r = 0; r < 3; r++)
            {
                c[i][j] += (a[i][r] * b[r][j]);
            }
            cout << c[i][j] << setw(7);
        }
        cout << endl;
    }


}

助けてください

4

1 に答える 1

2

実際には、結果にメモリを割り当てていません。コンパイラは、次のように宣言したときに、結果が 3x3 行列であることを理解できません。

double matrix[][N]= {0};

この場合とは異なり:

const double matrix1[][N] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}}; 

コンパイラはこれを 3x3 行列として「理解」します。

に変更double matrix[][N]= {0};するdouble matrix[N][N]= {0};と、問題が解決されます。

ところで、3 つの double しか使用できないのに 9 を使用したため、セグメンテーション違反/スタック オーバーフローが発生しました。

于 2013-11-01T08:30:40.117 に答える