2012-03-23 16 views
12

Piszę bibliotekę do mojego projektu (na razie używam Arduino). Problem, który mam, polega na tym, że string w C++ i Arduino różnią się.Jak łączyć łańcuchy C++ i łańcuchy Arduino?

To jest, chciałbym, aby moja biblioteka była niezależna od Arduino, więc używam #include <string>, a później deklaruję string s;. Jednak w Arduino łańcuchy są definiowane przez Arduino i deklarowane jako String s2.

Kiedy to moją bibliotekę do szkicu dostaję error: string: No such file or directory na linii, gdzie staram się to biblioteka C++ ciąg (#include <string>).

Czy istnieje sposób, aby Arduino używał biblioteki ciągów C++ lub konwertował ciąg znaków na ciąg Arduino podczas kompilowania?

Odpowiedz

9

Kilka rzeczy:

  1. Nie jestem pewien swojej racjonalne robić coś niezależnego od Arduino. Zazwyczaj programowanie mikrokontrolera nie jest czymś bardzo modulowanym i może bardzo różnić się od klasycznego programu komputerowego. Jeśli naprawdę chcesz być niezależny od jakiegokolwiek mikrokontrolera i dowolnej platformy, możesz nadal używać łańcuchów w stylu C, z char * wskazujących na tablicę znaków.
  2. Robienie tego, co chciałbyś robić, wcale nie jest łatwe. Przede wszystkim potrzebujesz kodu źródłowego twojej biblioteki std::string. Wykonanie #include <string> nie wystarczy: musisz również skompilować bibliotekę ciągów dla platformy AVR.
  3. Istnieje kilka "ograniczeń" w sposobie, w jaki Arduino przetwarza kod C++ w porównaniu z klasycznym programem komputerowym: na przykład operatory new i delete nie są zaimplementowane. Co więcej, implementacja std::string może wymagać innych rzeczy, więc wiele zależności do zarządzania lub zbyt duży rozmiar kodu źródłowego dla Arduino.

Istnieją pewne implementacje klasycznych narzędzi łańcuchowych dla mikrokontrolerów AVR jak Arduino, ale są one wykonane w sposób proceduralny (a nie w sposób obiektowego) na smyczki C-stylu. Na przykład, dla AVR-libc pochodzących z avr-gcc, można zobaczyć listę funkcji tutaj: avr-libc string.h nawet mieć stary dobry printf: avr-libc stdio.h

Jest możliwość korzystania z nich z Arduino jeśli dodać dobre pliki nagłówkowe w kodzie, ale pamiętaj o rozmiarze kodu! Samo użycie printf może zwiększyć rozmiar o kilka kilobajtów, co może być ogromne dla mikrokontrolera w zależności od potrzeb.

Podsumowując, moim zdaniem jedyny przenośny sposób byłoby użyć char * ciąg, http://arduino.cc/en/Reference/String

+0

Dzięki. Spróbuję użyć char *, ponieważ nie potrzebuję wielu strun. – Tautvydas

+1

Jak można wdrożyć C++ bez operatorów 'new' lub' delete'? Czy to nie zepsuje prawie wszystkiego? – anthropomorphic

+4

W C++ możliwe jest tworzenie obiektów na stosie z automatycznym przechowywaniem, bez użycia sterty. Po prostu nie używaj wskaźników i "nowych" podczas tworzenia obiektów. Obiekt jest następnie automatycznie usuwany na końcu zakresu, tak jak klasyczny prymityw. Z Arduino, dlatego obiekty są generalnie tworzone poza dowolnymi funkcjami w zasięgu globalnym, a następnie intializowane wewnątrz funkcji setup() (niewiele zrobiono w konstruktorze, preferowana jest funkcja init()). Można je następnie wykorzystać w funkcji loop() bez konieczności przekazywania jakichkolwiek odniesień do pętli(). –