2012-03-23 27 views
12

Projem için bir kütüphane yazıyorum (şimdilik Arduino kullanıyorum). Sahip olduğum problem, C++ ve Arduino'daki string'un farklı olmasıdır.C++ dizeleri ve Arduino Dizeleri nasıl birleştirilir?

Kitaplığımın Arduino'dan bağımsız olmasını isterim, bu yüzden #include <string> kullanıyorum ve daha sonra string s; bildiriyor. Ancak Arduino dizilerinde Arduino tarafından tanımlanmış ve String s2 beyan edilmiştir.

Kitaplığımı taslağa eklediğimde, C++ dize kitaplığı (#include <string>) eklemeye çalıştığım satırda error: string: No such file or directory olsun.

Arduino'nun C++ dizgi kitaplığını kullanması veya derleme sırasında dizeyi Arduino dizgisine dönüştürmesinin bir yolu var mı?

cevap

9

Birkaç şey:

  1. Ben Arduino bağımsız bir şey yapma senin rasyonel konusunda emin değilim. Genellikle, bir mikrodenetleyicinin programlanması çok modüle edilebilir bir şey değildir ve klasik bir bilgisayar programından çok farklı olabilir. Gerçekten herhangi bir mikrodenetleyiciden ve herhangi bir platformdan bağımsız olmak istiyorsanız, hala bir dizi arsa işaret eden char * ile C stili dizeleri kullanabilirsiniz.
  2. Ne yapmak istediğinizi yapmak hiç de kolay değildir. Öncelikle, std::string kitaplığınızın kaynak koduna ihtiyacınız olacaktır. Bir #include <string> yapmak yeterli değildir: AVR platformu için dize kitaplığını da derlemelisiniz. Arduino'nun klasik bir bilgisayar programı ile karşılaştırıldığı şekilde C++ kodunu işleme biçiminde bazı "sınırlamalar" vardır: örneğin, new ve delete operatörleri uygulanmamaktadır. Üstelik, std::string uygulaması tarafından başka şeylere ihtiyaç duyulabilir, dolayısıyla yönetilecek çok fazla bağımlılık veya Arduino için çok büyük bir kod kaynağı boyutu gerekebilir.

Arduino gibi AVR mikro klasik dize bazı araçları uygulamaları vardır, ancak bunlar C tarzı dizeleri (bir nesne yönelimli bir şekilde değil) bir prosedürel bir şekilde yapılır. Örneğin, avr-gcc ile gelen avr-Libc burada fonksiyonların listesini görebilirsiniz: avr-libc string.h Hatta sahip eski güzel printf: avr-libc stdio.h

eklerseniz Arduino ile bunları kullanmak mümkündür Kodunuzdaki iyi başlık dosyaları, ancak kodunuzun boyutuna dikkat edin! Sadece printf kullanarak, boyutunu birkaç kilobayt artırabilir, bu da ihtiyaçlarınıza bağlı olarak bir mikro denetleyici için çok büyük olabilir.

Sonuç olarak, aklımda, sadece taşınabilir yolu char * dize, http://arduino.cc/en/Reference/String

+0

Teşekkür kullanmak olacaktır. Sonra char * kullanmaya çalışacağım, çünkü çok fazla dizeye ihtiyacım yok. – Tautvydas

+1

"Yeni" veya "silme" operatörleri olmadan C++ nasıl uygulanabilir? Bu sadece her şeyi kırmaz mı? – anthropomorphic

+4

C++ ile yığın kullanarak değil, otomatik depolama ile yığın üzerinde nesneler oluşturmak mümkündür. Nesneleri oluştururken yalnızca işaretçiler ve "yeni" kullanmazsınız. Nesne, daha sonra, klasik bir ilkel gibi, kapsamın sonunda otomatik olarak silinir. Arduino ile, nesnelerin genellikle, genel kapsamdaki herhangi bir fonksiyonun dışında oluşturulduğu ve daha sonra setup() işlevinin içine intialize edildiği (kurucuda çok az, init() gibi bir işlev tercih edilir). Daha sonra, loop() işlevine herhangi bir işaretçi başvurusu göndermeye gerek kalmadan loop() işlevinde kullanılabilirler. –