0

我是 C++ 新手,正在尝试使用双指针为多维数组编写代码。这是我的代码:

类声明:

class magicMat{

    private:
         int** ptrnum;

    public:
        void init(int);
        void Display(int);
        void set(int);
        void message();
        void errorhandling(int);    
};

函数定义:

void magicMat::init(int input)
{       
    ptrnum=new int*[input];

    for (int row=0;row<input;row++)
        ptrnum[row]=new int[input]; 

    for(int x=0;x<input;x++)
    {
        for (int y=0;y<input;y++)
        {
            *(ptrnum[x]+y)=0;
        }
    }
}

void magicMat::set(int input)
{
    int row=1,col=input/2,otherdiag=0;

    for(int value=1;value<=input*input;value++)
    {
        if (*(ptrnum[row]+col)>0)
        {
            row=row+2;
            if(row>input)
                row=row-input;

            col--;
            if(col<1)
                col=input;
        }
        *(ptrnum[row]+col)+=value;
        *(ptrnum[0]+col)+=value;
        *(ptrnum[row]+0)+=value;

        if (row==col)
            *(ptrnum[0]+0)+=value;          

        if (row+col==input+1)
            otherdiag+=value;                 
/*                                                                        */
/*       Determine where new row and col are                              */
/*                                                                     */
         row--;
         if (row < 1)                       /* If row exceeds side then   */
            row = input;                    /*  goto other side.          */
         col++;
         if (col > input)                   /* If col exceeds side then   */
            col = 1; 
    }       
}

主功能:

int main()
{
    int num;
    magicMat newMat;
    newMat.message();
    while(1)
    {
        cin>>num;
        if (cin.good())
        {
            newMat.errorhandling(num);
        }
        else if (!isdigit(num))
        {
            cout<<"Please enter only digits"<<endl;
        }    
        newMat.init(num);
        newMat.set(num);
        newMat.Display(num);
    }
    cout<<"\nBye bye!\n"<<endl;
    return 0;
}

它在init函数中有效,但是在set函数中我尝试检查它在数据函数中的第一if条语句处中断的值。set

4

1 回答 1

0

您正在超出数组的范围。举个例子,如果我运行您的代码并输入5我的第一个数字来设置inputto的值,请查看函数5末尾的这些行:set

row--;
if (row < 1)
    row = input;

在第一次通过set函数中的循环结束时,就在这些行之前,row等于1. 这三行执行并因此row设置为等于5

在你的下一个循环开始时set,你这样做:

if (*(ptrnum[row]+col)>0)

问题是这ptrnum是一个 5x5 数组,这意味着有效索引是从 0 到 4。但是,在上一个循环结束时,您设置了rowequal ,5结果,您的索引超出了 of 的范围,ptrnum从而使您的程序崩溃。

我强烈建议您在调试器中单步执行您的代码,或者如果您不确定如何执行此操作,至少在您的函数中放入一堆cout语句,set这样您就可以检查变量是否设置为您认为应该设置的值设置为。

祝你好运!

于 2012-04-21T05:11:37.810 回答