我是一名Java开发人员,他试图在有限的Arduino环境中编写C ++代码。由于内存限制,异常和动态对象不可用或必须避免。
我的任务,创建一个解析字符缓冲区(十六进制半字节)并返回一个布尔值的方法,以指示成功以及实际结果。到目前为止我的尝试(避免不相关的东西):
class Parser {
unsigned char buffer[SIZE];
unsigned char index;
void parse();
bool parseHexNibble(unsigned char &result);
};
void Parser::parse() {
unsigned char result = 0;
if (!parseHexNibble(result)) {
return;
}
// do some work with result
}
bool Parser::parseHexNibble(unsigned char &result) {
unsigned char chr = buffer[index];
if (chr >= '0' && chr <= '9') {
result = chr - '0';
}
else if (chr >= 'A' && chr <= 'F') {
result = chr - 'A' + 10;
}
else {
return false;
}
index++;
return true;
}
这会有用吗?我不确定何时使用*
以及何时使用&
。有更好的解决方案吗?
答案 0 :(得分:3)
是的,这应该可行,但请注意,这不会考虑小写字符,但请注意您忘记返回true
以获得成功。
此外,您的方法和成员默认标记为private
。
如果发生故障,您还应初始化result
,否则如果忘记检查返回类型,则冒着使用未初始化变量的风险。
答案 1 :(得分:2)
有几种方法:
你做它的方式就是其中之一,虽然我建议使用指针而不是引用(*
而不是&
),因为有了引用,函数调用看起来像是在传递一个值(p.parseHexNibble(c)
),而指针版本更清晰,你可能想要存储在其中的东西(p.parseHexNibble(&c)
)。
另一个选项(这个是我个人最喜欢的)与getc
的做法相同:返回包含int
值char
的{{1}}或0 <= i < 256
发出错误信号。如果没有错误,-1
可以安全地进行类型转换和/或存储到int
。 (这假设您想要返回char
。)
第三种方法是返回一个包含布尔值和字符的结构(通过自己制作或使用char
等)。
在不相关的说明中,您应该使用std::pair
而不是char
来存储实际的字符值。 unsigned char
只应用于任意原始数据。
答案 2 :(得分:1)
首先,始终使用&amp;除非你需要*的特殊权力。在这种情况下,您不需要将pResult ++指向另一个字符,因此您不需要*。引用“就像指向间接已经打开的指针”(带有很长的细微异常列表),所以如果你只说* pResult,就说结果。
接下来,我不想考虑当参考位于未分配变量上时会发生什么。只需使用unsigned char result = 0;让每个人都开心一个健康的C ++编码风格总会有一些额外的冗长。
接下来,就像其他响应者所暗示的那样,也在 parseHexNibble()里面初始化结果(例如0),所以如果它有一个健康的非值method找不到可解析的字符。
接下来,chr - '0'的结果是一个整数,然后你静默地向下转换为unsigned char。在某些情况下,结果应该是一个整数,即使你确实从不使用它的高位。
我怀疑你的最后一行应该是真的。
现在我的通用建议A&gt;学习单元测试现在,不是更晚,B&gt;还学习了一种软语言,比如Ruby,所以你知道为什么 C ++是如此的不稳定,但有充分的理由。
(顺便说一句,即使您的平台启用了异常,从不使用它们意味着“此方法返回了错误或带外结果”。这种方式就是疯狂......)