私はこのプロジェクトに取り組んでいます: 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;
}
}
これを修正するための助けをいただければ幸いです。ありがとう!