返回多个值 我是一个java开发者,试图在有限的ARDUNO环境中对C++进行编码。由于内存限制,异常和动态对象不可用或必须避免

返回多个值 我是一个java开发者,试图在有限的ARDUNO环境中对C++进行编码。由于内存限制,异常和动态对象不可用或必须避免,c++,parameters,arduino,C++,Parameters,Arduino,我的任务是创建一个方法,该方法解析字符缓冲区(十六进制半字节),并返回一个布尔值以指示成功和实际结果。我迄今为止的尝试(避免了不相关的内容): 类解析器{ 无符号字符缓冲区[大小]; 无符号字符索引; void parse(); bool parseHexNibble(无符号字符和结果); }; void解析器::parse(){ 无符号字符结果=0; 如果(!parseHexNibble(结果)){ 返回; } //做一些有结果的工作 } bool解析器::parseHexNibble(无符号

我的任务是创建一个方法,该方法解析字符缓冲区(十六进制半字节),并返回一个布尔值以指示成功和实际结果。我迄今为止的尝试(避免了不相关的内容):

类解析器{
无符号字符缓冲区[大小];
无符号字符索引;
void parse();
bool parseHexNibble(无符号字符和结果);
};
void解析器::parse(){
无符号字符结果=0;
如果(!parseHexNibble(结果)){
返回;
}
//做一些有结果的工作
}
bool解析器::parseHexNibble(无符号字符和结果){
无符号字符chr=缓冲区[索引];

如果(chr>='0'&&chr='A'&&chr是,这应该可以工作,但请注意,这不包括小写字符,但请注意,如果成功,您忘记返回
true

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


如果失败,您还应该初始化
result
,否则,如果您忘记检查返回类型,您就有使用未初始化变量的风险。

是的,这应该可以工作,但请注意,这不包括小写字符,但请注意,如果成功,您忘记返回
true

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


如果失败,您还应该初始化
结果
,否则如果忘记检查返回类型,您就有使用未初始化变量的风险。

首先,始终使用&除非您需要*的特殊幂次。在这种情况下,您不需要预设++指向另一个字符,因此您不需要*引用“就像一个已经打开了间接寻址的指针”(有一长串微妙的异常),所以如果你只说*pResult,就说result

接下来,我不想考虑当一个未赋值变量的引用位子发生了什么。只使用无符号的CHAR结果=0;让每个人都感到高兴。一个健康的C++编码风格总是有一点额外的冗长。 接下来,像另一个响应程序所暗示的那样,还初始化parseHexNibble()内部的结果(例如到0),因此如果该方法未找到可解析字符,则它具有一个健康的非值

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

我猜你的最后一行应该是return true

现在我的一般性建议A>学习单元现在测试,而不是稍后,B>也学习一种软语言,如Ruby,所以你知道为什么C++是如此的轻率,但是有充分的理由。


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

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

接下来,我不想考虑当一个未赋值变量的引用位子发生了什么。只使用无符号的CHAR结果=0;让每个人都感到高兴。一个健康的C++编码风格总是有一点额外的冗长。 接下来,像另一个响应程序所暗示的那样,还初始化parseHexNibble()内部的结果(例如到0),因此如果该方法未找到可解析字符,则它具有一个健康的非值

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

我猜你的最后一行应该是return true

现在我的一般性建议A>学习单元现在测试,而不是稍后,B>也学习一种软语言,如Ruby,所以你知道为什么C++是如此的轻率,但是有充分的理由。 (顺便说一句,即使您的平台启用了异常,也不要使用它们来表示“此方法返回了错误或带外结果”。这种方式是疯狂的…

有几种方法:

虽然我建议使用指针而不是引用(
*
而不是
&
),但您这样做的方式就是其中之一,因为使用引用时,函数调用看起来像是在传递一个值(
p.parseHexNibble(c)
),而指针版本更清楚,您可能希望在其中存储一些内容(
p.parseHexNibble(&c)

另一个选项(这是我个人的最爱)与
getc
的功能相同:返回一个
int
,该值包含
char
值(
0有几种方法:

虽然我建议使用指针而不是引用(
*
而不是
&
),但您这样做的方式就是其中之一,因为使用引用时,函数调用看起来像是在传递一个值(
p.parseHexNibble(c)
),而指针版本更清楚,您可能希望在其中存储一些内容(
p.parseHexNibble(&c)


另一个选项(这是我个人的最爱)与
getc
的功能相同:返回一个
int
,其中包含
char
值(<代码> 0查看 STD::或代码> >代码:Boo::可选的。请重读我的第一段。这是一个基本的C++环境。抱歉,我猜我读得不太好。这只是一个很难的规则,我用“代码> */<代码>和<代码>和代码>进行。变量可以是
NULL
否则
&
。它可能并不总是适用。查看
std::pair
boost::optional
。它们都很好
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;
}