我是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;
}
}
我确信有一种更好的方法可以将矩阵相乘,但我更有兴趣知道为什么这段特殊代码不起作用;它看起来很简单,我无法看到错误的来源。
答案 0 :(得分: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()
返回一个值。