地下城生成代码分割错误

Segmentation Fault on Dungeon Generation code

本文关键字:分割 错误 代码 地下城      更新时间:2023-10-16

在这段看似正常的生成代码中出现了段错误。
我把它缩小到这个函数:

    std::array<uint16_t, 5> makeExit(int rm) {
        std::array<uint16_t, 5> ex;
        std::array<uint16_t, 4> room;
        room = roomList[rm];
        int rx, ry, rx2, ry2;
        while (1) {
            int rw = rand() % 4;
            switch (rw) {
            case 0:
                // north wall
                rx = room[2] + (rand() % room[1]);
                ry = room[3] - 1;
                rx2 = rx;
                ry2 = ry - 1;
                break;
            case 1:
                // east wall
                rx = room[3] + (rand() % room[0]);
                ry = room[2] + room[1];
                rx2 = rx + 1;
                ry2 = ry;
                break;
            case 2:
                // south wall
                rx = room[2] + (rand() % room[1]);
                ry = room[3] + room[0];
                rx2 = rx;
                ry2 = ry + 1;
                break;
            case 3:
                // west wall
                rx = room[3] + (rand() % room[0]);
                ry = room[2] - 1;
                rx2 = rx - 1;
                ry2 = ry;
                break;
            if (mapData[ry2][rx2] == 2) {
                // this is a wall, exit
                ex[0] = (uint16_t) rx;
                ex[1] = (uint16_t) ry;
                ex[2] = (uint16_t) rx2;
                ex[3] = (uint16_t) ry2;
                ex[4] = (uint16_t) rw;
                break;
            }
        }
        return ex;
    }

经过几个小时的调试,我仍然不知道它在哪里。
分段故障似乎发生在第3或第4个循环之后。
roomList是std::array<uint16_t, 4>std::vector,它保存地牢的房间数据,mapData是uint16_t的2D std::vector,它保存贴图数据。在valgrind上,它写的是
Invalid read of size 2Address 0x31 is not stack'd, malloc'd or (recently) free'd
你们能帮我找到分段故障吗?

Wow epic fail:/
看起来mapData[ry2][rx2]应该是mapData[ry][rx]。(facepalm指)
我还修复了switch语句(另一个史诗般的失败:|)
我用来生成房间的函数(makeRoom())返回了一些我不想要的数字(rand() % 8 + 5而不是rand() % 8 + 3),所以我改变了!
现在没有段错误了