4

我是 C++ 新手,我正在尝试编写一个使用双指针将两个数组相乘的程序。到目前为止,我的代码是:

        #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每次j启动新循环时,我都将其初始化为 0。这更正了代码中的另一个错误。

如果您声明变量的范围尽可能小,那会好很多。像这样:

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 回答