const int led = 13;
นั่นคือวิธีที่ถูกต้อง หรือแม้กระทั่ง:
const byte led = 13;
คุณมีพินกี่อัน?
บทเรียนบางบทไม่ผ่านการควบคุมคุณภาพเท่าที่ควร
ประสิทธิภาพจะดีขึ้นเมื่อใช้const byte
เปรียบเทียบกับint
คอมไพเลอร์อาจฉลาดพอที่จะรู้ว่าคุณกำลังทำอะไรอยู่
สิ่งที่คุณสามารถทำได้คือกระตุ้นให้ผู้คนใช้เทคนิคที่มีประสิทธิภาพมากขึ้นโดยใช้พวกเขาในรหัสของคุณเอง
ตอบสนองต่อความคิดเห็น
ผู้แสดงความคิดเห็นแนะนำว่าbyte
ไม่เป็นมาตรฐาน C นี่ถูกต้อง แต่นี่เป็นเว็บไซต์ Arduino StackExchange และฉันเชื่อว่าการใช้ประเภทมาตรฐานที่จัดทำโดย Arduino IDE นั้นเป็นที่ยอมรับ
ใน Arduino.h มีบรรทัดนี้:
typedef uint8_t byte;
โปรดทราบว่านี่ไม่เหมือนกันunsigned char
ทุกประการ ดูuint8_t เทียบกับถ่านที่ไม่ได้ลงชื่อและuint8_t char ถ่านที่ไม่ได้ลงชื่อเมื่อใด .
ผู้แสดงความคิดเห็นคนอื่นแนะนำว่าการใช้ไบต์จะไม่จำเป็นต้องปรับปรุงประสิทธิภาพเนื่องจากตัวเลขที่เล็กกว่าint
จะได้รับการเลื่อนขั้นเป็นint
(ดูกฎการส่งเสริมการขายแบบจำนวนเต็มหากคุณต้องการข้อมูลเพิ่มเติม)
อย่างไรก็ตามในบริบทของตัวระบุconstคอมไพเลอร์จะสร้างรหัสที่มีประสิทธิภาพในทุกกรณี ตัวอย่างเช่นการแยกส่วน "กะพริบ" ให้สิ่งนี้ในรูปแบบเดิม:
00000086 <loop>:
86: 8d e0 ldi r24, 0x0D ; 13
88: 61 e0 ldi r22, 0x01 ; 1
8a: 1b d1 rcall .+566 ; 0x2c2 <digitalWrite>
ในความเป็นจริงมันสร้างรหัสเดียวกันไม่ว่าจะเป็น13
:
- เป็นตัวอักษร
- คือ
#define
- คือ
const int
- คือ
const byte
คอมไพเลอร์ทราบว่าสามารถใส่ตัวเลขลงในหนึ่งทะเบียนและเมื่อไม่สามารถทำได้ แต่มันเป็นวิธีที่ดีที่จะใช้การเข้ารหัสที่บ่งชี้ว่าคุณเจตนา การconst
ทำให้ชัดเจนว่าตัวเลขจะไม่เปลี่ยนแปลงและทำให้byte
(หรือuint8_t
) ทำให้ชัดเจนว่าคุณคาดหวังว่าจะมีจำนวนน้อย
ข้อความแสดงข้อผิดพลาดที่สับสน
อีกเหตุผลสำคัญที่ควรหลีกเลี่ยง#define
คือข้อความแสดงข้อผิดพลาดที่คุณได้รับหากคุณทำผิดพลาด พิจารณาภาพร่าง "กะพริบ" ซึ่งมีข้อผิดพลาด:
#define LED = 13;
void setup() {
pinMode(LED, OUTPUT); // <---- line with error
}
void loop() {
digitalWrite(LED, HIGH); // <---- line with error
delay(1000);
digitalWrite(LED, LOW); // <---- line with error
delay(1000);
}
บนพื้นผิวมันก็โอเค แต่มันก็สร้างข้อความผิดพลาดขึ้นมา:
Blink.ino: In function ‘void setup()’:
Blink:4: error: expected primary-expression before ‘=’ token
Blink:4: error: expected primary-expression before ‘,’ token
Blink:4: error: expected `;' before ‘)’ token
Blink.ino: In function ‘void loop()’:
Blink:8: error: expected primary-expression before ‘=’ token
Blink:8: error: expected primary-expression before ‘,’ token
Blink:8: error: expected `;' before ‘)’ token
Blink:10: error: expected primary-expression before ‘=’ token
Blink:10: error: expected primary-expression before ‘,’ token
Blink:10: error: expected `;' before ‘)’ token
คุณดูที่บรรทัดที่ไฮไลต์แรก (บรรทัดที่ 4) และไม่เห็นแม้แต่สัญลักษณ์ "=" นอกจากนี้เส้นดูดี ตอนนี้มันค่อนข้างชัดเจนว่าปัญหาคืออะไรที่นี่ ( = 13
กำลังถูกแทนที่ด้วยLED
) แต่เมื่อบรรทัดคือ 400 บรรทัดต่อไปในรหัสมันไม่ชัดเจนว่าปัญหาคือวิธีการกำหนด LED
ฉันเคยเห็นคนตกหลุมรักมาหลายครั้งแล้ว (รวมถึงตัวฉันด้วย)