0

私は制限付きの Arduino 環境で C++ のコーディングを試みている Java 開発者です。例外と動的オブジェクトは使用できないか、メモリの制限により回避する必要があります。

私の仕事は、文字バッファー (16 進数のニブル) を解析し、成功と実際の結果を示すブール値を返すメソッドを作成することです。これまでの私の試み(無関係なものは避けました):

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

いくつかの方法があります:

*あなたがそれをした方法はそれらの1つですが、参照ではなくポインタを使用することをお勧めしますが、&参照では、関数呼び出しは値を渡しているように見えますが( p.parseHexNibble(c))、ポインタバージョンはより明確です。そこに何かを保存したい ( p.parseHexNibble(&c))。

別のオプション (これは私の個人的なお気に入りです) は、同じことをgetc行います:値 ( )intを含むか、エラーを通知することです。エラーがない場合、を安全に型キャストしたり、 に格納したりできます。(これは、返そうとするのが事実であると想定しています。)char0 <= i < 256-1intcharchar

3 番目の方法は、ブール値と文字を含む構造体を返すことです (独自のものを作成するか、使用std::pairするなどして)。

無関係なメモとして、実際の文字値を格納するのcharではなく、使用する必要があります。任意の生データにのみ使用してください。unsigned charunsigned char

于 2012-05-31T19:44:16.573 に答える
1

まず、* の特別な力が必要でない限り、常に & を使用してください。この場合、pResult++ で別の文字を指す必要がないため、* は必要ありません。参照は「インダイレクションがすでにオンになっているポインターのようなもの」です (微妙な例外の長いリストがあります)。したがって、*pResult とだけ言う場合は、単に結果と言ってください。

次に、割り当てられていない変数に参照が置かれたときに何が起こるかについては考えたくありません。unsigned char result = 0; を使用するだけです。みんなを幸せに保つために。健全な C++ コーディング スタイルには、常に少し余分な冗長性があります。

次に、他のレスポンダーが暗示しているように、parseHexNibble()内の結果初期化します (0 など)。そのため、メソッドが解析可能な文字を検出しない場合は、健全な非値になります。

次に、chr - '0' の結果は整数であり、これを無言で unsigned char にダウンキャストします。場合によっては、実際に上位ビットを使用しない場合でも、結果は整数になるはずです。

そして、最後の行は true を返す必要があると思います。

ここで、私の一般的なアドバイス A> 単体テストを今すぐ学び、後でではなく、B> Ruby などのソフト言語も学びましょう。

(ところで、プラットフォームで例外が有効になっている場合でも、「このメソッドがfalseまたは帯域外の結果を返した」という意味でそれらを使用しないでください。その方法は狂気です...)

于 2012-05-31T19:37:09.593 に答える