程序在大输入时停止

时间:2015-08-26 12:00:13

标签: c++ pointers

我正在尝试使用C ++中的指针进行矩阵乘法,但对于大输入,程序停止执行。没有任何错误。如果有人知道解决方法,请告诉我。

以下是代码:

#include <iostream>
using namespace std;

int main() {

    int r1,c1,r2,c2;//variables

    cin>>r1;    
    cin>>c1;
    cin>>r2;
    cin>>c2;

    int **a, **b,**c;
    int sum=0;

    if (c1 == r2){
        a = new int *[c1]; //1st array
        b = new int *[c2]; //2nd array

        for (int i =0; i<=c1 ; i++ ){
            a[i] = new int [r1];
        } //constructing array

        for (int i =0; i<=c2 ; i++ ){
            b[i] = new int [r2];
        }//constructing array

        //input for 1st matrix
        for(int j=0; j<r1; j++){
            for(int k=0; k<c1; k++){
                cin>>a[j][k];
            }
        } 

        //input for 1st matrix
        for(int j=0; j<r2; j++){
            for(int k=0; k<c2; k++){
                    cin>>b[j][k];
                }
        }
        cout<<endl;

        //matrix multiplication
        for(int i=0;i<r1;i++){  
            for(int j=0;j<c2;j++){
                sum =0;
                for(int k=0; k<r1;k++){
                sum+= a[i][k]*b[k][j]; //matrix multiplication
                }
                cout<<sum<<" ";
            }
            cout<<endl;
        }
    }
    else{
        cout<<"Please enter feaseble values";
    }
    // prints !!!Hello World!!!
    return 0;
}

INPUT:

> 4 5
> 5 2
> 1 2 3 4 5
> 6 7 8 9 10
> -10 -9 -8 -7 -6
> -5 -4 -3 -2 -1
> 1 2
> 3 4
> 5 5
> 4 3 //the code stops here and doesn't take any further inputs
> 2 1

4 个答案:

答案 0 :(得分:2)

您正在向后定义数组。在创建动态二维数组时,可以使用

的形式执行此操作
int** ary = new int*[rowCount];
for(int i = 0; i < rowCount; ++i)
    ary[i] = new int[colCount];

你在做什么

int** ary = new int*[colCount];
for(int i = 0; i < colCount; ++i)
    ary[i] = new int[rowCount];

我建议您使用2d std::vector并让向量处理所有分配。创建一个你可以做的二维矢量

std::vector<std::vector<int>> matrixA(rowCount, std::vector<int>(colCount));

答案 1 :(得分:1)

根据初始化矩阵的方式,你在处理行和列方面不一致,你应该有:

a[col][row]

但是,您将在以后的cin中对待它们:

a[row][col]

所以只要下定决心哪个应该是第一个维度,哪个应该是第二个维度并相应地修复,你应该没问题。

答案 2 :(得分:1)

在为rc分配内存时,您错误地交换了ab的值。

正确的代码段应为

a = new int *[r1]; //1st array
b = new int *[r2]; //2nd array

for (int i =0; i<=r1 ; i++ ){
    a[i] = new int [c1];
} //constructing array

for (int i =0; i<=r2 ; i++ ){
    b[i] = new int [c2];
}//constructing array

答案 3 :(得分:1)

您正在访问超出其大小的数组,因为某些for循环中的退出条件为<=,但它应为<

a = new int *[c1]; //1st array
b = new int *[c2]; //2nd array

for (int i =0; i<=c1 ; i++ ){ // Here you should have i<c1
    a[i] = new int [r1];
} //constructing array

for (int i =0; i<=c2 ; i++ ){ // Here you should have i<c2
    b[i] = new int [r2];
}//constructing array

此外,当您创建矩阵时,您遵循错误的顺序。您应首先创建行,然后创建列。你正在反过来这样做,这导致指数消失。尝试交换行和列,如下所示:

a = new int *[r1]; //1st array
b = new int *[r2]; //2nd array

for (int i =0; i<r1 ; i++ ){
    a[i] = new int [c1];
} //constructing array

for (int i =0; i<r2 ; i++ ){
    b[i] = new int [c2];
}//constructing array

我可以编译它,我得到结果

  38    37  
 103   107  
-105  -117  
 -40   -47

编辑:

出于好奇,我检查了这个结果,这是错误的。正确的应该是:

  48    42
 123   117
-117  -123
 -42   -48

错误在于,当您将使用r1个元素的元素相乘时,它们实际上是c1。因此,要修复错误,您必须更改使用k的for循环的退出条件,从for(int k=0; k<r1;k++){for(int k=0; k<c1;k++){