2012-03-23 26 views
12

Tôi đã viết thư viện cho dự án của mình (hiện tại tôi đang sử dụng Arduino). Vấn đề mà tôi có là string trong C++ và Arduino khác nhau.Làm thế nào để kết hợp các chuỗi C++ và các chuỗi Arduino?

Tức là, tôi muốn thư viện của mình độc lập với Arduino, vì vậy tôi đang sử dụng #include <string> và sau đó khai báo string s;. Tuy nhiên trong chuỗi Arduino được xác định bởi Arduino và tuyên bố String s2.

Khi tôi đưa thư viện của mình vào bản vẽ, tôi nhận được error: string: No such file or directory trên dòng nơi tôi cố gắng đưa thư viện chuỗi C++ (#include <string>).

Có cách nào để làm cho Arduino sử dụng thư viện chuỗi C++ hoặc chuyển chuỗi thành chuỗi Arduino khi biên dịch không?

Trả lời

9

Một số điều:

  1. Tôi không chắc chắn về lý trí của bạn làm một cái gì đó độc lập với Arduino. Thông thường, lập trình một vi điều khiển không phải là một cái gì đó rất có thể điều chỉnh và có thể rất khác với một chương trình máy tính cổ điển. Nếu bạn thực sự muốn độc lập với bất kỳ vi điều khiển nào và bất kỳ nền tảng nào, bạn vẫn có thể sử dụng các chuỗi kiểu C, với một số char * trỏ đến một mảng ký tự.
  2. Làm những gì bạn muốn làm là không hề dễ dàng chút nào. Trước hết, bạn sẽ cần mã nguồn của thư viện std::string của mình. Làm một #include <string> là không đủ: bạn cũng phải biên dịch thư viện chuỗi cho nền tảng AVR.
  3. Có một số "hạn chế" trong cách Arduino xử lý mã C++ so với chương trình máy tính cổ điển: ví dụ: các toán tử newdelete không được triển khai. Hơn nữa, những thứ khác có thể cần thiết bởi việc thực hiện std::string, vì vậy rất nhiều phụ thuộc để quản lý hoặc kích thước nguồn mã quá lớn đối với Arduino.

Có một số triển khai công cụ chuỗi cổ điển cho vi điều khiển AVR như Arduino, nhưng chúng được thực hiện theo cách thủ tục (chứ không phải theo cách hướng đối tượng) cho chuỗi kiểu C. Ví dụ, đối với avr-libc đến với avr-gcc, bạn có thể xem danh sách các chức năng ở đây: avr-libc string.h Bạn thậm chí có tốt cũ printf: avr-libc stdio.h

Có thể sử dụng chúng với Arduino nếu bạn thêm các tệp tiêu đề tốt trong mã của bạn, nhưng hãy cẩn thận với kích thước mã của bạn! Chỉ cần sử dụng printf có thể tăng kích thước lên vài kilobyte, có thể rất lớn đối với vi điều khiển tùy theo nhu cầu của bạn.

Để kết luận, trong tâm trí của tôi, cách cầm tay duy nhất là sử dụng một chuỗi char *, http://arduino.cc/en/Reference/String

+0

Cảm ơn. Tôi sẽ cố gắng sử dụng char * sau đó, vì tôi không cần nhiều dây. – Tautvydas

+1

Làm cách nào để có thể triển khai C++ mà không có toán tử 'new' hoặc' delete'? Nó sẽ không phá vỡ mọi thứ? – anthropomorphic

+4

Với C++, có thể tạo các đối tượng trên ngăn xếp với bộ nhớ tự động, trong khi không sử dụng vùng heap. Bạn chỉ cần không sử dụng con trỏ và "mới" trong khi tạo đối tượng. Đối tượng sau đó được tự động xóa ở cuối phạm vi, giống như nguyên thủy cổ điển. Với Arduino, đó là lý do tại sao các đối tượng thường được tạo ra bên ngoài bất kỳ hàm nào trong phạm vi toàn cục, và sau đó được intialized bên trong hàm setup() (ít được thực hiện trong hàm tạo, một hàm init() như được ưu tiên). Sau đó chúng có thể được sử dụng trong hàm loop() mà không phải chuyển bất kỳ tham chiếu con trỏ nào tới vòng lặp(). –

Các vấn đề liên quan