0

我正在研究这个项目:https ://github.com/zsteve/zebra-zmachine-interpreter 它应该是 z-machine 故事文件的解释器,但我仍在研究它。

无论如何,我遇到的错误在 ztext.cpp 和 ZDictionary 的单元测试 main.cpp 中。zChartoDictionaryZCharString() 应该返回一个指向 zword 的字符串/数组的指针。它正在正确创建/计算该数组,但奇怪的是未能正确返回它......

错误发生在 ztext.cpp 的第 499 行:[code] return (outWord);[/code] 就在此时,outWord 指向一个 zwords 数组:由 new[] 分配的 {15 25, 28 ab}

一旦返回到https://github.com/zsteve/zebra-zmachine-interpreter/blob/master/zdictionary/zdictionary/main.cpp中的第 42 行,返回的 zword* 现在指向 {50 00, 00 00},这不应该发生。

我花了一个小时调试整个事情,直到我发现这是出错的地方。所以我的问题是:是什么导致我的程序出现这个问题?我怀疑它要么是不匹配的 new[]/delete[](这会导致它吗?),要么是 zChartoDictionaryZCharString() 中的 std::vector 对象。这是代码:

在第 40 行的 main.cpp (/zdictionary/zdictionary/main.cpp) 中:

// error occurs here :
// at this point : tmp == {15 25 28 ab}
zword* tmp=zChartoDictionaryZCharString(tmp_);

在第 502 行的 ztext.cpp (/ztext/ztext/ztext.cpp) 中:

zword* zChartoDictionaryZCharString(zword* zstring)
{
// converts a normal zchar string to a dictionary zchar string
// returns a zword* to either a 2 or 3 zword array.
    std::vector<zchar> vector1=expandZChars(zstring);
    std::vector<zchar> vector2(0);
    if(zVersion<=3){
        // for versions 1 to 3, dictionary word length is 4 bytes (6 zchars)
        int done=0;
        for(int i=0; i<vector1.size() && i<6; i++, done++)
        {
            vector2.push_back(vector1[i]);
        }
        if(done<6)
        {
            for(int i=done; i<6; i++)
            {
                vector2.push_back(5);
            }
        }
        // now we need to pack them to 2x zwords.
        zword* outData=new zword[2];
        zchar* zcharArray=new zchar[vector2.size()];
        for(int i=0; i<vector2.size(); i++) zcharArray[i]=vector2[i];
        outData[0]=endianize(packZChars(zcharArray));
        outData[1]=endianize(packZChars(zcharArray+3)|128);
        delete[] zcharArray;
        vector1.clear();
        vector2.clear();
        return outData;
    }else if(zVersion>3){
        // for versions 4 and up, dictionary word length is 6 bytes (9 zchars)
        int done=0;
        for(int i=0; i<vector1.size() && i<9; i++, done++)
        {
            vector2.push_back(vector1[i]);
        }
        if(done<9)
        {
            for(int i=done; i<9; i++)
            {
                vector2.push_back(5);
            }
        }
        // now we need to pack them to 3x zwords.
        zword* outData=new zword[3];
        zchar* zcharArray=new zchar[vector2.size()];
        for(int i=0; i<vector2.size(); i++) zcharArray[i]=vector2[i];
        outData[0]=packZChars(zcharArray);
        outData[1]=packZChars(zcharArray+3);
        outData[2]=packZChars(zcharArray+6);
        outData[2]|=128;
        for(int i=0; i<3; i++) outData[i]=endianize(outData[i]);
        delete[] zcharArray;
        return outData;
    }
}

任何有关解决此问题的帮助将不胜感激。谢谢!

4

0 回答 0