Estoy encontrando a mí mismo otra vez confundido por C cadenas de caracteres, etc.

Aquí es el código que estoy usando para probar la sintaxis en el Arduino. Sé que *mensaje)buff me va a dar un puntero (yo todavía no sé realmente por qué tengo que usar punteros, pero puedo hacer algunas investigaciones en eso!), Tengo que convertir el *message_buff a una Cadena (sólo algo que hacer, pero tenga en cuenta que, posteriormente, cuando intento imprimir esta cadena para que de serie solo me dan una sola » c » de caracteres).

Me puse un puntero de matriz de 3 elementos largo (3 bytes de largo ??? Realmente no lo sé):

char *mqtt_command[3] = {};

y más tarde cuando intento agregar un valor a la matriz de uso:

*mqtt_command[i] = str;

Me sale el error:

error: invalid conversion from 'char*' to 'char'

si cambio de que:

mqtt_command[i] = str;

(sin el *) compila bien. No sé por qué…

Aquí está mi código:

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
}

y aquí está el resultado:

command
range
1
Command: range
MQTT string: c

Por favor alguien puede ayudarme a entender caracteres, cadenas de caracteres, los punteros, arrays de char ? Donde puedo ir para una buena ronda de todos los tutoriales sobre el tema ?

Lo que estoy haciendo es pasando una cadena de comando (creo que es una cadena, tal vez es una matriz de char????) a través de MQTT, el mensaje es:

command:range:1

Estoy tratando de construir un pequeño protocolo para hacer las cosas en el Ardiuno cuando un MQTT mensaje es recibido. Puedo manejar el MQTT devoluciones de llamada de multa, que no es el problema, el problema es que realmente no entiendo C y cadenas de caracteres. Me gustaría ser capaz de manejar comandos como:

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

etc

Cualquier ayuda sería muy apreciada.

  • Obtener y leer un buen libro en C.
  • Útil. Gracias.
InformationsquelleAutor ilium007 | 2013-01-21

2 Comentarios

  1. 7

    Usted necesita un C (o C++) de imprimación en primer lugar, usted necesita trabajar más en su comprensión de las declaraciones y de la sintaxis de puntero de acceso y así sucesivamente.

    Este:

    char *mqtt_command[3] = {};

    significa «mqtt_command es una matriz de 3 char *«, es decir, tres punteros a caracteres. Dado que las cadenas están representadas como punteros a caracteres, esto puede ser llamado «una matriz de tres cuerdas». No hay espacio para los propios personajes, sin embargo, esto no es suficiente para trabajar, pero es un buen comienzo.

    A continuación, el primer error es este código:

    *mqtt_command[i] = str;

    El problema que el compilador se queja es de que estás eliminar cosas demasiadas veces. Sólo mqtt_command[i] es suficiente, que evalúa a la i:th valor de la matriz, que tiene el tipo char *. Entonces, su inicial asterisco elimina referencias ese puntero, lo que significa que el tipo de la parte izquierda de la expresión es ahora char, es decir, es un solo carácter. No se puede asignar un puntero a un carácter, (normalmente) no caben.

    Caída de la inicial de asterisk para solucionar esto.

    A analizar más adelante, este:

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

    también es incorrecto, por la misma razón. Estás eliminar la referencia de la message_buff puntero, por lo que el argumento de la String() constructor es sólo el primer carácter, es decir,c. De nuevo, la caída de la inicial asterisco, significa que:

    String msgString = String(message_buf);

    que puede ser escrito como justo:

    String msgString(message_buf);
    • Muy apreciado – ¿ tienes alguna sugerencia (sin juego de palabras) para una buena y sólida C imprimación ?
    • Rápido C intro (sobre todo matrices/cadena/chars) yo recomiendo «la Cabeza » Primera C» amazon.com/Head-First-C-David-Griffiths/dp/1449399916/…
    • Ok cool – he leído en la Cabeza de otros Primeros libros y son muy buenos. Voy a dar que uno vaya.
    • También recomiendo Harbison & Steele de la C: Manual de Referencia como un compañero de referencia.
  2. 0
    mqtt_command[i] = str;

    Esto va a funcionar, como mqtt_command[i] ya es puntero char. * le redirigirá a cualquier anteriormente memoria asignada, lo que no hace en el código.

Dejar respuesta

Please enter your comment!
Please enter your name here