我正在开展这个项目:https://github.com/zsteve/zebra-zmachine-interpreter 这应该是z-machine故事文件的翻译,但我还在努力。
无论如何,我遇到的错误是在ztext.cpp和ZDictionary的单元测试main.cpp中。 zChartoDictionaryZCharString()应该返回一个指向字符串/ zwords数组的指针。 它正在正确创建/计算该数组,但奇怪的是无法正确返回它...
错误发生在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},这不应该发生。
我花了一个小时调试整个事情,直到我发现这是它出错的地方。 所以我的问题是:在我的程序中导致此问题的原因是什么? 我怀疑它是无法匹配的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;
}
}
任何有关修复此问题的帮助将不胜感激。 谢谢!