我是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
语句处断开的值。
答案 0 :(得分:0)
你正走出数组的边界。举个例子,如果我运行您的代码并输入5
作为我的第一个数字,将input
的值设置为5
,请查看{{1}末尾的这些行功能:
set
在row--;
if (row < 1)
row = input;
函数第一次循环结束时,set
等于row
。这三行执行,因此1
设置为row
。
在5
的下一个循环开始时,您可以执行以下操作:
set
问题是if (*(ptrnum[row]+col)>0)
是一个5x5数组,这意味着有效索引是0-4。但是,在上一个循环结束时,您将ptrnum
设置为等于row
,因此,您将在5
的范围之外进行索引,从而导致程序崩溃。
我强烈建议您在调试器中单步调试代码,或者如果您不确定如何执行此操作,请至少在ptrnum
函数中添加一些cout
语句,以便您可以检查变量是否设置为您认为应该设置的值。