2012-03-23 13 views
12

He estado escribiendo una biblioteca para mi proyecto (por ahora estoy usando Arduino). El problema que tengo es que string en C++ y en Arduino son diferentes.¿Cómo combinar cadenas de C++ y cadenas de Arduino?

Es decir, me gustaría que mi biblioteca sea independiente de Arduino, entonces estoy usando #include <string> y luego declaro string s;. Sin embargo, Arduino define las cadenas Arduino y declaró String s2.

Cuando incluyo mi biblioteca en el boceto obtengo error: string: No such file or directory en la línea donde trato de incluir la biblioteca de cadenas C++ (#include <string>).

¿Hay alguna manera de hacer que Arduino use la biblioteca de cadenas C++, o convertir una cadena en una cadena Arduino al compilar?

Respuesta

9

varias cosas:

  1. no estoy seguro acerca de su racional de hacer algo independiente de Arduino. Por lo general, programar un microcontrolador no es algo muy modulable y puede ser muy diferente de un programa informático clásico. Si realmente desea ser independiente de cualquier microcontrolador y cualquier plataforma, aún puede usar cadenas de estilo C, con un char * apuntando a una matriz de caracteres.
  2. Hacer lo que le gustaría hacer no es nada fácil. En primer lugar, necesitaría el código fuente de su biblioteca std::string. Hacer un #include <string> no es suficiente: también debe compilar la biblioteca de cadenas para la plataforma AVR.
  3. Existen algunas "limitaciones" en la forma en que Arduino procesa el código C++ en comparación con un programa informático clásico: por ejemplo, los operadores new y delete no están implementados. Además, es posible que la implementación std::string necesite otras cosas, por lo que hay que gestionar muchas dependencias o un tamaño de fuente de código demasiado grande para Arduino.

Existen algunas implementaciones de herramientas de cuerda clásicas para el microcontrolador AVR como Arduino, pero se realizan de forma procedural (y no de forma orientada a objetos) para cadenas estilo C. Por ejemplo, para el avr-libc viene con avr-gcc, se puede ver la lista de las funciones aquí: avr-libc string.h Incluso tiene la buena vieja printf: avr-libc stdio.h

Es posible utilizarlos con Arduino si se agrega los buenos archivos de encabezado en tu código, pero ten cuidado con el tamaño de tu código. Simplemente usando printf puede aumentar el tamaño en varios kilobytes, lo que puede ser enorme para un microcontrolador según sus necesidades.

Para concluir, en mi opinión, la única manera portátil sería utilizar una cadena char *, http://arduino.cc/en/Reference/String

+0

Gracias. Trataré de usar char *, ya que no necesito muchas cadenas. – Tautvydas

+1

¿Cómo se puede implementar C++ sin operadores 'new' o' delete'? ¿Eso no rompería casi todo? – anthropomorphic

+4

Con C++, es posible crear objetos en la pila con almacenamiento automático, sin usar el montón. Simplemente no utiliza punteros y "nuevo" al crear objetos. El objeto se elimina automáticamente al final del alcance, como una primitiva clásica. Con Arduino, es por eso que los objetos se crean generalmente fuera de cualquier función en el ámbito global, y luego se inicializan dentro de la función setup() (poco se hace en el constructor, se prefiere una función init() like). Luego pueden usarse en la función loop() sin tener que pasar ninguna referencia de puntero a loop(). –