我正在制作一种类似peggle的游戏,它会询问用户他们想要的切换板有多大(所有三角形),为什么他们想要抛出许多球(ping)。并且有机会向右走o。我想我真的很接近我刚开始收到这个错误:
lab6.exe中0x00DB6253处的未处理异常:0xC0000005:
访问冲突读取位置0xFDFDFDFD。
在运行期间counts[init1][init2] = counts[init1][init2] + 1;
行。
#include <iostream>
#include <array>
#include "time.h"
using namespace std;
int main()
{
srand(time(NULL));
int bins = 0;
int pings = 0;
int init1 = 0;
int init2 = 0;
int percent;
cout << "How big would you like the triangle?" << endl;
cin >> bins;
cout << "How many pings?" << endl;
cin >> pings;
cout << "percent to go right?" << endl;
cin >> percent;
int **counts = new int*[bins];
for (int i = 0; i < bins; i++)
{
counts[i] = new int[i + 1];
}
for (int j = 0; j < bins; j++)
{
for (int k = 0; k <= j; k++)
{
counts[j][k] = 0;
//cout << counts[j][k] << " ";
}
cout << endl;
}
for (int i = 0; i < pings; i++)
{
for (int j = 0; j < bins - 1; j++)
{
int random = rand() % 101;
if (random <= percent)
{
counts[init1][init2] = counts[init1][init2] + 1;
init1++;
init2++;
}
else
{
init1++;
if (init2 != 0)
{
init2--;
}
counts[init1][init2] = counts[init1][init2] + 1;
}
}
}
for (int i = 0; i < bins; i++)
{
delete[] counts[i];
}
delete[] counts;
system("pause");
return 0;
}
答案 0 :(得分:0)
在这个地方:
init1++;
if (init2 != 0)
在递增之后你不会检查是否init1 < bins
。
答案 1 :(得分:0)
我不确切知道你在做什么,但显然你没有在内部for循环之后重置init1和2。
当执行init1 ++ ping *(bins - 1)次时,它超过了已分配的计数数组大小。
答案 2 :(得分:0)
这就是我解决问题的方法:
for (int i = 0; i < pings; i++)
{
int init1 = 0;
int init2 = 0;
在i-loop的第一次迭代中, init1
的范围从0到bins
...但由于它没有被重置,所以它下次开始时不是0而是{{1}这太大了。
我假设bins
也需要重置为0,但由于我不确定你的程序的意图,我不能发誓。如果没有,您可以将其重置为适当的。