4

私はC++を初めて使用し、ダブルポインタを使用して2つの配列を乗算するプログラムを作成しようとしています。これまでの私のコードは次のとおりです。

        #include <iostream>
    using namespace std;

    //multiplies two matrices A(mxl) and B(lxn) to produce C(mxn)

    int m,l,n;
    int **A, **B, **C;

void main(void)
{

...ユーザーはm、l、nを入力し、このようにメモリを割り当てます。

int i, j;

//creates a new mxl array   
A= (int**) new int*[m];
for(i=0;i<m;i++)
    {
        A[i]=new int[l];
    }

//creates a lxn array
B = (int**) new int*[l];
for(i=0;i<l;i++)
    {
        B[i]=new int[n];
    }

//creates a mxn array
C = (int**) new int*[m];
for(i=0;i<n;i++)
    {
        C[i]=new int[n];
    }

int sum = 0;
for(i=0;i<m;i++)
{
    for(j=0;j<n;j++)
    {
        for(int k=0;k<l;k++)
        {
            sum =+ A[i][k]*B[k][j];
        }
    }
      //cout<sum<<"\t";

これまでのところ、すべてが正常に機能しています。これをcout'sum'に変更すると、配列のすべての正しい要素が正しい順序で返されます。この値を配列に入れようとすると、エラーメッセージが返されます。

    C[i][j]=sum; 
    }
}

行列を乗算するためのはるかに優れた方法があると確信していますが、この特定のコードが機能しない理由を知りたいと思っています。非常にシンプルに見え、エラーがどこから来ているのかわかりません。

4

1 に答える 1

5

アップデートでは、次のコードを追加しました。

C = (int**) new int*[m];
for(i=0;i<n;i++)
{
    C[i]=new int[n];
}

ループ条件が正しくありません。i<nあなたの代わりにi<m

乗算ループは次のようになります。

for(i=0;i<m;i++)
{
    for(j=0;j<n;j++)
    {
        for(int k=0;k<l;k++)
        {
            sum =+ A[i][k]*B[k][j];
        }
    }
    C[i][j]=sum; 
}

割り当てC[i][j]が間違ったブロックにあります-[j]アレイアクセスが範囲外です。

次のようになります。

for(i=0;i<m;i++)
{
    for(j=0;j<n;j++)
    {
        sum = 0;
        for(int k=0;k<l;k++)
        {
            sum =+ A[i][k]*B[k][j];
        }
        C[i][j]=sum; 
    }
}

新しいループが開始さsumれるたびに0に初期化したことに注意してください。jこれにより、コード内の別のエラーが修正されます。

可能な限り狭いスコープで変数を宣言すると、はるかに良いでしょう。このような:

for(int i=0;i<m;i++)
{
    for(int j=0;j<n;j++)
    {
        int sum = 0;
        for(int k=0;k<l;k++)
        {
            sum =+ A[i][k]*B[k][j];
        }
        C[i][j]=sum; 
    }
}

コンパイラがへの割り当ての元の配置を拒否することを実行した場合C[i][j]

関数mainは次のように宣言する必要があります。

int main()

から値を返す必要がありますmain()

于 2012-12-08T23:42:41.460 に答える