0

我是一名 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;
}

这行得通吗?我不确定何时使用*以及何时使用&. 有更好的解决方案吗?

4

3 回答 3

3

是的,这应该可行,但请注意,这不考虑小写字符,但请注意您忘记返回true成功。

此外,您的方法和成员默认标记为private

您还应该result在失败的情况下进行初始化,否则如果您忘记检查返回类型,您将面临使用未初始化变量的风险。

于 2012-05-31T19:27:19.987 回答
2

有几种方法:

你这样做的方式就是其中之一,虽然我建议使用指针而不是引用(*而不是&),因为使用引用,函数调用看起来像你正在传递一个值(p.parseHexNibble(c)),而指针版本更清楚你可以想要存储在其中的东西(p.parseHexNibble(&c))。

另一种选择(这是我个人最喜欢的)与此相同getc:返回int包含char值 ( 0 <= i < 256) 或-1发出错误信号的 an。在没有错误的情况下,int可以安全地进行类型转换和/或存储到char. (这假设它是char您想要返回的事实。)

第三种方法是返回一个包含布尔值和字符的结构(通过自己制作或使用std::pair等)。

在不相关的说明中,您应该使用char而不是unsigned char存储实际的字符值。unsigned char只能用于任意原始数据。

于 2012-05-31T19:44:16.573 回答
1

首先,除非您需要 * 的特殊功能,否则请始终使用 &。在这种情况下,你不需要 pResult++ 来指向另一个字符,所以你不需要 *. 引用“就像一个已经打开间接的指针”(带有一长串微妙的异常),所以如果你只说 *pResult,就说 result。

接下来,我不想考虑当引用位于未分配的变量上时会发生什么。只需使用 unsigned char 结果 = 0; 让每个人都开心。健康的 C++ 编码风格总是会有一些额外的冗长。

接下来,像其他响应者所暗示的那样,也在parseHexNibble () 中初始化结果(例如为 0),因此如果该方法没有找到可解析的字符,则它具有健康的非值。

接下来, chr - '0' 的结果是一个整数,然后您将其默默地向下转换为无符号字符。在某些情况下,结果应该是一个整数,即使您确实从不使用它的高位。

而且我怀疑您的最后一行应该返回 true。

现在我的一般建议 A>现在学习单元测试,而不是以后,并且 B> 还学习一门软语言,例如 Ruby,所以你知道为什么C++ 如此挑剔,但有充分的理由。

(顺便说一句,即使您的平台启用了异常,也不要使用它们来表示“此方法返回错误或带外结果”。这种方式很疯狂......)

于 2012-05-31T19:37:09.593 回答