C++ 类静态数组字段值突然更改(C+;+;)
这是块类的代码段:C++ 类静态数组字段值突然更改(C+;+;),c++,C++,这是块类的代码段: class Block { public: //size satu blok(dalam byte) static const int BLOCK_SIZE = 4096; Block(int number,byte *data):number(number) { for(int i=0;i<BLOCK_SIZE;i++) { this->data[i] = data[i];
class Block { public:
//size satu blok(dalam byte)
static const int BLOCK_SIZE = 4096;
Block(int number,byte *data):number(number) {
for(int i=0;i<BLOCK_SIZE;i++) {
this->data[i] = data[i];
}
}
void test();
private:
byte data[BLOCK_SIZE];
const int number; };
test是一个从数据块中打印前四个字节的函数
当我第一次在getblock中使用test函数时,它会像我想要的那样打印(与文件相同),但是当我在调用getblock之后第二次尝试打印它时,它会打印随机值
有人知道错误在哪里吗?我不能仅从代码中判断,但看起来您可能只是将
数据的值存储在块构造函数中,而不是将其内容复制到成员数据数组中<代码>数据
将在getBlock()
的末尾超出范围,这将使读取其内存的任何尝试无效。我不能仅从代码中判断,但看起来您可能只是将数据
的值存储在块
构造函数中,而不是将其内容复制到成员数据数组中<代码>数据
将在getBlock()
结束时超出范围,这将使读取其内存的任何尝试无效
block = new Block(number,data);
此行创建一个新的Block
对象,并将其分配给参数Block
。但是,指针块
通过值传递到函数中,因此原始指针超级块
不受此行影响。因此,您在函数内部和外部对不同的块
-对象进行操作
要解决此问题,可以使用指针引用作为参数:
bool Filesystem::getBlock(int number, Block *&block);
此行创建一个新的Block
对象,并将其分配给参数Block
。但是,指针块
通过值传递到函数中,因此原始指针超级块
不受此行影响。因此,您在函数内部和外部对不同的块
-对象进行操作
要解决此问题,可以使用指针引用作为参数:
bool Filesystem::getBlock(int number, Block *&block);
您可能必须以二进制模式打开fin流。否则,“\r”字符将丢失(跳过) 您可能必须以二进制模式打开fin流。否则,“\r”字符将丢失(跳过) 这一行有几个错误:
fstream fin(path);
在这些方面:
for(int i=0;i<Block::BLOCK_SIZE;i++) {
fin>>data[i];
}
另一个错误是将数据读取为字符,而不是二进制数据。此外,您不需要在循环中一次使用一个字节:
fin.read(data, Block::BLOCK_SIZE);
我还建议将fstream
更改为ifstream
,因为您不在函数中对文件进行任何输出
另一个错误,正如在另一个答案中指出的,是如何传递块
参数。这一行有几个错误:
fstream fin(path);
在这些方面:
for(int i=0;i<Block::BLOCK_SIZE;i++) {
fin>>data[i];
}
另一个错误是将数据读取为字符,而不是二进制数据。此外,您不需要在循环中一次使用一个字节:
fin.read(data, Block::BLOCK_SIZE);
我还建议将fstream
更改为ifstream
,因为您不在函数中对文件进行任何输出
另一个错误,正如在另一个答案中指出的那样,是如何传递block
参数。您只需执行block->test()
而不是(*block).test()
。一个小建议是:在block
构造函数中,使用函数,而不是在循环中一次复制一个字节的数据。它针对这类事情进行了优化。您只需执行block->test()
而不是(*block).test()
。一个小建议:在block
构造函数中,使用函数,而不是在循环中一次复制一个字节的数据。它针对这类事情进行了优化。构造函数正确地复制了数据,这不是问题。构造函数正确地复制了数据,这不是问题。嗯,我得到了文件系统。h:28:38:错误:无法声明指向“类块&”文件系统的指针。cpp:68:47:错误:无法声明指向“类块&”的指针。我意识到了这一点,但评论晚了。谢谢你的帮助!嗯,我得到了文件系统。h:28:38:错误:无法声明指向“类块&”文件系统的指针。cpp:68:47:错误:无法声明指向“类块&”的指针。我意识到了这一点,但评论晚了。谢谢你的帮助!谢谢你的建议。至于我为什么每次使用循环一个字节来填充数据,是因为fin.read()需要char*(这里的数据是byte*)@bysreg我猜byte
只是char
的一个typedef。在标准C或C++中没有<代码>字节<代码>类型。至于我为什么每次使用循环一个字节来填充数据,是因为fin.read()需要char*(这里的数据是byte*)@bysreg我猜byte
只是char
的一个typedef。标准C或C++中没有<代码>字节<代码>类型。