c++ - 在循环结束时崩溃控制台应用程序。寻求建议。 (内图)

标签 c++ crash

<分区>

(基于 C++ CLR 的项目)

下图为调试过程。基本上,该程序旨在为游戏绘制简单的 ASCII 级别。 (30 x 30,并且在循环的每次迭代中绘制一个字符(“空格”或“+”))

http://imageshack.us/photo/my-images/52/prgramcrash.jpg/

x 是宽度,y 是高度。所以它会在宽度上循环 30 次,每次绘制一个“+”,然后 y 应该将行更改为下一行并开始绘制更多的“+”。然而,在绘制了第一行的 30 个“+”之后,我在调试过程中采取的下一步会使应用程序崩溃(右下角出现奇怪的消息)。

在第 77 行发生崩溃,没有读取其他代码行,程序按计划完成打印出 30'+',并在 for (x) 循环退出时(返回到 for y,高度循环)它就死了。

这是基于我正在关注的教程,我整天都在观看视频检查代码以查找错误,但我肯定遗漏了一些东西。

我已经在底部的链接中包含了整个代码(code::blocks 项目),但我怀疑这里的任何人都愿意帮助我 :p,真的我只是希望有更多经验的人知道什么可能是造成这次崩溃的原因,并在正确的方向上插入我解决问题。

真心希望大家帮帮忙! :D

codeblocks 项目链接:http://www.mediafire.com/?15nw8saa6x86b80

最佳答案

这里的问题是您将 drawEngine 定义为具有 80 的宽度和高度:

class DrawEngine
{
    public:
        DrawEngine (int xSize = 80, int ySize = 50);
 ...
};

然而,当您创建关卡时,您是说该关卡的大小应为 30x30:

bool Game::run(void)
{

    level = new Level(&drawArea, 30, 30);
    ....
}

然后将关卡设置为大小为 30x30 的数组,并将该 30x30 数组传递到 drawArea:

Level::Level(DrawEngine *de, int w, int h)
{
    drawArea = de;

    width = w;
    height = h;

    player = 0;

    // char** create memory for every position in the level.
    level = new char *[width];

    for (int x = 0; x < width; x++)
        level[x] = new char[height];


    //create the level
    createLevel();

    drawArea->setMap(level);
}

这里的循环实际上越界了,因为它认为它有一个可以循环大小为 80x80 的数组,而实际上它只有 30x30:

void DrawEngine::drawBackground(void)
{
    if (map)
    {

        for (int y = 0; y < screenHeight; y++)
        {
            gotoxy(0, y);

            for (int x = 0; x < screenWidth; x++)
                cout << tileImage[map[x][y]];
        }
    }
}

那怎么解决呢?那么,您必须更改尺寸以使它们以某种方式匹配,或者您添加代码以正确说明屏幕可能大于实际级别这一事实。

例如,您可能想按照以下方式做一些事情:

for (int x = 0; x < levelWidth; x++)
{
   for (int y = 0; y < levelHeight; y++)
   {
        // do stuff with level[x][y]
   }
}

相对于:

for (int x = 0; x < screenWidth; x++)
{
   for (int y = 0; y < screenHeight; y++)
   {
        // do stuff with level[x][y]
   }
}

因为在第二种情况下

if (screenWidth > levelWidth || screenHeight > levelHeight)
 BadThingsWillHappen();

关于c++ - 在循环结束时崩溃控制台应用程序。寻求建议。 (内图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6397865/

相关文章:

c++ - Linux 上的键盘键代码表

C 数独解算器崩溃并返回进程 -1073741819 (0xC000005)

ios - 使用 block 指针作为成员变量时 iOS 中与 ARC 相关的崩溃

c++ - std::copy with return values - 防止 "expression: string iterators incompatible"的更好方法?

c++ - 回调和主游戏循环。这是一个好习惯吗?

c++ - 查找整数中出现的数字

c++ - void 函数允许返回 "nothing"吗?

ios - Facebook iOS SDK [NSNull count]:无法识别的选择器崩溃BIG

c++ - Qt C++ : removing next-to-last item from QListWidget makes program crash

android - 为什么关闭或按“后退”按钮时我的React Native Android应用程序崩溃?