2012-03-23 28 views
12

Ho scritto una libreria per il mio progetto (per ora sto usando Arduino). Il problema che ho è che string in C++ e in Arduino differiscono.Come combinare stringhe C++ e stringhe Arduino?

Cioè, vorrei che la mia libreria fosse indipendente da Arduino, quindi sto usando #include <string> e successivamente dichiarando string s;. Tuttavia in Arduino le stringhe sono definite da Arduino e dichiarate String s2.

Quando includo la mia libreria nello schizzo, ottengo error: string: No such file or directory sulla riga in cui tento di includere la libreria di stringhe C++ (#include <string>).

C'è un modo per far sì che Arduino usi la libreria di stringhe C++ o converta una stringa in una stringa Arduino durante la compilazione?

risposta

9

diverse cose:

  1. non sono sicuro circa la vostra razionale di fare qualcosa di indipendente di Arduino. Di solito, programmare un microcontrollore non è qualcosa di molto modulabile e può essere molto diverso da un programma per computer classico. Se vuoi davvero essere indipendente da qualsiasi microcontrollore e da qualsiasi piattaforma, puoi comunque utilizzare le stringhe in stile C, con un char * che punta a un array di caratteri.
  2. Fare ciò che ti piacerebbe fare non è affatto facile. Prima di tutto avresti bisogno del codice sorgente della tua libreria std::string. Fare un #include <string> non è sufficiente: devi anche compilare la libreria di stringhe per la piattaforma AVR.
  3. Esistono alcune "limitazioni" nel modo in cui Arduino elabora il codice C++ rispetto a un programma per computer classico: ad esempio, gli operatori new e delete non sono implementati. Inoltre, altre cose potrebbero essere necessarie all'implementazione di std::string, quindi molte dipendenze da gestire o una dimensione di codice sorgente troppo grande per Arduino.

Esistono alcune implementazioni di strumenti di stringa classici per il microcontrollore AVR come Arduino, ma vengono eseguite in modo procedurale (e non in modo orientato agli oggetti) per le stringhe in stile C. Ad esempio, per l'AVR-libc venire con avr-gcc, è possibile visualizzare l'elenco delle funzioni qui: avr-libc string.h ancora di avere il buon vecchio printf: avr-libc stdio.h

E 'possibile usarli con Arduino se si aggiunge i buoni file di intestazione nel tuo codice, ma fai attenzione alle dimensioni del tuo codice! L'uso di printf può aumentare le dimensioni di diversi kilobyte, che possono essere enormi per un microcontrollore a seconda delle esigenze.

Per concludere, nella mia mente, l'unico modo portabile potrebbe essere quella di utilizzare una stringa char *, http://arduino.cc/en/Reference/String

+0

Grazie. Cercherò di usare char * allora, dal momento che non ho bisogno di molte stringhe. – Tautvydas

+1

Come si può implementare C++ senza operatori 'new' o' delete'? Non spezzerebbe tutto? – anthropomorphic

+4

Con C++, è possibile creare oggetti nello stack con l'archiviazione automatica, mentre non si utilizza l'heap. Basta non usare puntatori e "nuovi" durante la creazione di oggetti. L'oggetto viene automaticamente eliminato alla fine dell'oscilloscopio, come una primitiva classica. Con Arduino, è il motivo per cui gli oggetti vengono generalmente creati al di fuori di qualsiasi funzione nell'ambito globale e quindi inizializzati all'interno della funzione setup() (poco è fatto nel costruttore, è preferibile una funzione simile a init()). Possono quindi essere utilizzati nella funzione loop() senza dover passare alcun riferimento a puntatore a loop(). –