const int led = 13;
Itu adalah metode yang benar. Atau bahkan:
const byte led = 13;
Berapa pin yang Anda miliki?
Beberapa tutorial tidak cukup melalui kontrol kualitas sebanyak mungkin.
Performa akan lebih baik digunakan const byte
, dibandingkan dengan int
namun kompiler mungkin cukup pintar untuk menyadari apa yang Anda lakukan.
Yang dapat Anda lakukan adalah dengan lembut mendorong orang untuk menggunakan teknik yang lebih efisien dengan menggunakannya dalam kode Anda sendiri.
Tanggapan terhadap komentar
Seorang komentator telah menyarankan bahwa byte
ini bukan standar C. Ini benar, namun ini adalah situs Arduino StackExchange, dan saya percaya menggunakan tipe standar yang disediakan oleh Arduino IDE dapat diterima.
Di Arduino.h ada baris ini:
typedef uint8_t byte;
Perhatikan bahwa ini tidak persis sama dengan unsigned char
. Lihat uint8_t vs unsigned char dan When is uint8_t ≠ unsigned char? .
Komentator lain menyarankan bahwa menggunakan byte tidak selalu meningkatkan kinerja, karena angka yang lebih kecil dari yang int
akan dipromosikan int
(lihat Aturan Promosi Integer jika Anda menginginkan lebih banyak tentang ini).
Namun dalam konteks pengidentifikasi const , kompiler akan menghasilkan kode yang efisien dalam hal apa pun. Misalnya, membongkar "blink" memberikan ini dalam bentuk aslinya:
00000086 <loop>:
86: 8d e0 ldi r24, 0x0D ; 13
88: 61 e0 ldi r22, 0x01 ; 1
8a: 1b d1 rcall .+566 ; 0x2c2 <digitalWrite>
Bahkan ia menghasilkan kode yang sama apakah 13
:
- Apakah harfiah
- Adalah
#define
- Adalah
const int
- Adalah
const byte
Kompiler tahu kapan ia bisa memasukkan nomor ke dalam satu register dan kapan tidak. Namun itu praktik yang baik untuk menggunakan pengkodean yang menunjukkan niat Anda . Memperjelas const
bahwa angkanya tidak akan berubah, dan membuatnya byte
(atau uint8_t
) menjelaskan bahwa Anda mengharapkan sejumlah kecil.
Pesan kesalahan yang membingungkan
Alasan utama lain yang harus dihindari #define
adalah pesan kesalahan yang Anda dapatkan jika Anda melakukan kesalahan. Pertimbangkan sketsa "blink" yang memiliki kesalahan:
#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);
}
Di permukaan terlihat OK, tetapi menghasilkan pesan kesalahan ini:
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
Anda melihat garis yang disorot pertama (baris 4) dan bahkan tidak melihat simbol "=". Plus, garis terlihat baik-baik saja. Sekarang sudah cukup jelas apa masalahnya di sini ( = 13
sedang diganti LED
), tetapi ketika garis 400 baris lebih jauh dalam kode, tidak jelas masalahnya dengan cara LED didefinisikan.
Saya telah melihat orang jatuh untuk ini berkali-kali (termasuk saya).