2

C文字列や文字などで再び混乱していることに気づきました。

Arduinoで構文をテストするために使用しているコードを次に示します。(* message)buffが私にポインターを与えることを知っています(私はまだポインターを使用する必要がある理由を本当に知りませんが、それについていくつかの調査を行うことができます!)、私は* message_buffを文字列に変換します(何かすることですが、後でこの文字列をシリアルに出力しようとすると、「c」文字が1つしか表示されないことに注意してください。

配列ポインタを3要素の長さに設定しました(3バイトの長さ??私は本当にわかりません):

char *mqtt_command[3] = {};

後で、次のコマンドを使用して配列に値を追加しようとすると、次のようになります。

*mqtt_command[i] = str;

エラーが発生します:

エラー:「char*」から「char」への無効な変換

これを次のように変更した場合:

mqtt_command[i] = str;

(*なし)正常にコンパイルされます。どうしてか分かりません...

これが私のコードです:

char *message_buff = "command:range:1";
char *str;
String msgString = String(*message_buff);
char *mqtt_command[3] = {};
int i = 0;

void setup()
{
  Serial.begin(9600);
  delay(500);

  while ((str = strtok_r(message_buff, ":", &message_buff)) != NULL)
  {
    Serial.println(str);
    mqtt_command[i] = str;
    i++;
  }

  delay(1000);

  Serial.print("Command: ");
  Serial.println(mqtt_command[1]);

  Serial.print("MQTT string: ");
  Serial.println(msgString);
}

void loop()
{
  // Do something here later
}

そしてここに出力があります:

command
range
1
Command: range
MQTT string: c

文字、文字列、ポインタ、および文字配列をどのように理解できますか?このトピックに関する優れたオールラウンドチュートリアルはどこに行けばよいですか?

MQTTを介してコマンド文字列(文字列だと思いますが、char配列である可能性がありますか????)を渡しています。メッセージは次のとおりです。

command:range:1

MQTTメッセージを受信したときにArduinoで何かを行うための小さなプロトコルを構築しようとしています。MQTTコールバックは問題なく処理できますが、問題はありません。問題は、Cの文字列と文字がよくわからないことです。次のようなコマンドを処理できるようにしたいと思います。

command:range:0
command:digital:8
read:sensor:2

4

2 に答える 2

7

最初に C (および/または C++) の入門書が必要です。宣言やポインター アクセスの構文などについて理解を深める必要があります。

これ:

char *mqtt_command[3] = {};

"mqtt_commandは 3 " の配列char *、つまり文字への 3 つのポインタであることを意味します。文字列は文字へのポインタとして表現されるため、これを「3 つの文字列の配列」と呼ぶことができます。ただし、キャラクター自体の実際のスペースがないため、これで作業するには十分ではありませんが、良いスタートです.

次に、最初のエラーは次のコードです。

*mqtt_command[i] = str;

コンパイラが不平を言っている問題は、物事を何度も逆参照していることです。mqtt_command[i]type を持つ配列の i: 番目の値に評価されるだけで十分char *です。次に、最初のアスタリスクはそのポインターを逆参照します。これは、左側の式の型が現在char、つまり単一の文字であることを意味します。ポインターを文字に割り当てることはできません。(通常) 収まりません。

これを解決するには、最初のアスタリスクを削除します。

さらに分析するには、次のようにします。

char *message_buff = "command:range:1";
String msgString = String(*message_buff);

も同じ理由で間違っています。ポインターを逆参照しているmessage_buffため、コンストラクターへの引数String()は単に最初の文字、つまりc. 繰り返しますが、最初のアスタリスクを削除します。つまり、次のことを意味します。

String msgString = String(message_buf);

次のように記述できます。

String msgString(message_buf);
于 2013-01-21T10:44:34.520 に答える