Arduino vít lên chương trình tầm thường liên quan đến enum


7

Kìa sự điên rồ này:

enum WhatArduinoIs {
  Easy, But, Insane, Obsolete, And, Far, Worse, Than, mBed
};

void TellMe(WhatArduinoIs pls) { }

void setup() { }
void loop() { }

Tôi khá giỏi về C ++, vì vậy tôi khá chắc chắn rằng nên biên dịch. Tuy nhiên tôi nhận được lỗi này:

sketch_jan21b.ino:3:13: error: variable or field 'TellMe' declared void
sketch_jan21b.ino:3:13: error: 'WhatArduinoIs' was not declared in this scope
Error compiling.

Tôi đã gặp phải xu hướng của Arduino "IDE" đối với việc sửa đổi các chương trình điên rồ và hoàn toàn không linh hoạt trước đây. Cụ thể khi bạn #includethư viện Arduino chỉ thêm một cách kỳ diệu các tệp C ++ có liên quan nếu đó #includelà trong bản phác thảo chính của bạn. #include <LiquidCrystal.h>trong tập tin C ++ khác? Liên kết lỗi.

Tôi nghi ngờ trong trường hợp này là Arduino đang cố gắng thêm các khai báo hàm vào đầu tập tin để thứ tự của chúng không thành vấn đề. Tức là nó biến tập tin thành thế này:

void TellMe(WhatArduinoIs pls);

enum WhatArduinoIs {
  Easy, But, Insane, Obsolete, And, Far, Worse, Than, mBed
};

void TellMe(WhatArduinoIs pls) { }

void setup() { }
void loop() { }

Điều đó rõ ràng không hoạt động. Làm thế nào tôi có thể nói với Arduino để rời khỏi chương trình chết tiệt của tôi một mình?

Câu trả lời:


6

Bạn có thể giải quyết vấn đề bằng cách đặt enumchức năng và chức năng của bạn vào một không gian tên. Bạn thậm chí có thể tận dụng các không gian tên không tên C ++ nếu bạn thích:

namespace
{
  enum WhatArduinoIs {
    Easy, But, Insane, Obsolete, And, Far, Worse, Than, mBed
  };

  void TellMe(WhatArduinoIs pls) { }
}

void setup() { }
void loop() { }

Thật khó chịu (cũng như nhiều thứ trong Arduino IDE), nhưng nó dường như hoạt động.

Nếu bạn có nhiều kinh nghiệm hơn với lập trình thì bạn có thể muốn xem xét sử dụng IDE bên thứ 3 với plugin Arduino, chẳng hạn như Eclipse. Arduino IDE thực sự chỉ được thiết kế cho người mới bắt đầu.


Hoặc thậm chí một cái gì đó như Geany với (hoặc không có) Ino.
Ignacio Vazquez-Abrams

Cảm ơn! Tôi sẽ nói điều duy nhất tồi tệ hơn IDE của Arduino là Eclipse, nhưng tôi nghĩ thực sự tôi nghĩ ngay cả Eclipse cũng có thể tốt hơn! Tôi rất thích Qt Creator - Tôi sử dụng nó cho mBed. Tôi cuối cùng có thể phải thiết lập Arduino trong đó. Vấn đề là nhiều chi tiết về hệ thống xây dựng của Arduino bị ẩn đi Arduino.exenên việc thiết lập bất kỳ IDE nào khác là một điều khó khăn. Không biết Eclipse đã có một plugin Arduino mặc dù.
Timmmm

Ngoài ra còn có Atmel Studio Ide miễn phí. Nó hỗ trợ các tính năng lập trình chuyên nghiệp như nhiều tệp nguồn, SVN và trình gỡ lỗi rồng AVR.
kiwiron

Đây là một cái gì đó đang được sửa chữa. Hãy thử IDE được liên kết tại đây github.com/arduino/Arduino/pull/2729 . Bản phác thảo sẽ biên dịch tốt.
Federico Fissore

Hoặc bạn chỉ có thể sử dụng một Makefile đơn giản. Có một vài Arduino Makefiles chung trôi nổi, gần như tất cả các IDE làm, ngoại trừ gây rối với nguồn của bạn.
Edgar Bonet

4

Bạn có vẻ đúng về những gì IDE arduino đang làm với bản phác thảo của bạn.

Arduino sẽ không xử lý trước bất kỳ tệp .h hoặc .cpp nào, vì vậy bạn có thể sử dụng tệp thứ hai. bạn cũng có thể phá vỡ chức năng định vị regex của IDE bằng một throw()câu lệnh giả như thế này:

void TellMe(WhatArduinoIs pls) throw() { }

Ném giả cho phép nó biên dịch cho tôi vào ngày 1.5.8


1

Tất cả bạn cần là một nguyên mẫu chức năng. Tôi có một lời giải thích chi tiết tại Lớp học và các đối tượng: có bao nhiêu và loại tệp nào tôi thực sự cần sử dụng chúng?

Vì vậy, điều này biên dịch:

enum WhatArduinoIs {
  Easy, But, Insane, Obsolete, And, Far, Worse, Than, mBed
};

void TellMe(WhatArduinoIs pls);  // prototype
void TellMe(WhatArduinoIs pls) 
  {
  }
void setup() { }
void loop() { }

Tham chiếu ngoài trang web: Cách tránh các quirks của tệp phác thảo IDE tiền xử lý

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.