返回多个值

时间:2012-05-31 19:22:03

标签: c++ parameters arduino

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

这会有用吗?我不确定何时使用*以及何时使用&。有更好的解决方案吗?

3 个答案:

答案 0 :(得分:3)

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

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

如果发生故障,您还应初始化result,否则如果忘记检查返回类型,则冒着使用未初始化变量的风险。

答案 1 :(得分:2)

有几种方法:

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

另一个选项(这个是我个人最喜欢的)与getc的做法相同:返回包含intchar的{​​{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 ++是如此的不稳定,但有充分的理由。

(顺便说一句,即使您的平台启用了异常,从不使用它们意味着“此方法返回了错误或带外结果”。这种方式就是疯狂......)