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 の配列を指します: {15 25, 28 ab} によって割り当てられた new[]

https://github.com/zsteve/zebra-zmachine-interpreter/blob/master/zdictionary/zdictionary/main.cppの42 行目に戻ると、返された zword* は {50 00, 00 00} を指します。これは起こるべきではありません。

これが問題の原因であることがわかるまで、1 時間かけて全体をデバッグしました。だから私の質問は:私のプログラムでこの問題を引き起こす原因は何ですか? 一致しない new[]/delete[] (これが原因でしょうか?) または zChartoDictionaryZCharString() の std::vector オブジェクトのいずれかであると思われます。コードは次のとおりです。

main.cpp (/zdictionary/zdictionary/main.cpp) の 40 行目から:

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

ztext.cpp (/ztext/ztext/ztext.cpp) の 502 行目:

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