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、関数の最後にある次の行を確認できます。input5set

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

関数内のループの最初の最後で、setこれらの行の直前で、rowは に等しくなり1ます。これらの 3 行が実行され、その結果、 にrow等しく設定され5ます。

の次のループの開始時に、次のようにsetします。

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

問題はptrnum、5x5 配列であることです。これは、有効なインデックスが 0 ~ 4 であることを意味します。ただし、前のループの最後にrowequal を設定する5と、その結果、 の境界外にインデックスを作成することにptrnumなり、プログラムがクラッシュします。

デバッガーでコードをステップ実行するか、その方法がわからない場合は、少なくとも関数に一連のcoutステートメントを入れsetて、変数が想定どおりに設定されていることを確認できるようにすることを強くお勧めしますに設定します。

幸運を!

于 2012-04-21T05:11:37.810 に答える