Saya tidak punya pengalaman sebelumnya dengan C ++ atau C, tetapi tahu cara memprogram C # dan saya belajar Arduino. Saya hanya ingin mengatur sketsa saya dan cukup nyaman dengan bahasa Arduino bahkan dengan keterbatasannya, tetapi saya benar-benar ingin memiliki pendekatan berorientasi objek untuk pemrograman Arduino saya.
Jadi saya telah melihat bahwa Anda dapat memiliki cara berikut (bukan daftar lengkap) untuk mengatur kode:
- Satu file .ino;
- Beberapa file .ino dalam folder yang sama (apa yang IDE panggil dan tampilkan seperti "tab");
- File .ino dengan file .h dan .cpp yang disertakan dalam folder yang sama;
- Sama seperti di atas, tetapi file-file tersebut adalah pustaka yang diinstal di dalam folder program Arduino.
Saya juga telah mendengar cara-cara berikut, tetapi belum membuatnya bekerja:
- Mendeklarasikan kelas gaya C ++ dalam file .ino yang sama, tunggal (pernah dengar, tetapi tidak pernah terlihat berfungsi - apakah itu mungkin?);
- [pendekatan yang disukai] Termasuk file .cpp di mana kelas dideklarasikan, tetapi tanpa menggunakan file .h (ingin pendekatan ini, haruskah itu berhasil?);
Perhatikan bahwa saya hanya ingin menggunakan kelas sehingga kode lebih dipartisi, aplikasi saya harus sangat sederhana, hanya melibatkan tombol, led dan buzzers.
programming
c++
class
heltonbiker
sumber
sumber
Jawaban:
Bagaimana IDE mengatur berbagai hal
Hal pertama, ini adalah bagaimana IDE mengatur "sketsa" Anda:
.ino
adalah salah satu nama yang sama dengan folder di dalamnya. Jadi, untukfoobar.ino
difoobar
folder - file utama adalah foobar.ino..ino
File - file lain di folder itu digabungkan bersama-sama, dalam urutan abjad, di akhir file utama (terlepas dari di mana file utama berada, berdasarkan abjad)..cpp
file (mis.foobar.cpp
) - ditempatkan di folder kompilasi sementara.#include <libraryname>
arahan. Ini memicu IDE untuk juga menyalin semua file yang relevan dari masing-masing (disebutkan) perpustakaan ke folder sementara, dan menghasilkan instruksi untuk mengkompilasi mereka..c
,.cpp
atau.asm
file dalam folder sketsa ditambahkan ke proses build sebagai unit kompilasi terpisah (yaitu, mereka dikompilasi dengan cara biasa sebagai file terpisah).h
file juga disalin ke dalam folder kompilasi sementara, sehingga mereka dapat disebut dengan c atau Cpp file Anda.main.cpp
)strcpy
dll.)Efek samping dari semua ini adalah Anda dapat menganggap sketsa utama (file .ino) sebagai C ++ untuk semua maksud dan tujuan. Namun, pembuatan prototipe fungsi dapat menyebabkan pesan kesalahan yang tidak jelas jika Anda tidak berhati-hati.
Menghindari kebiasaan pra-prosesor
Cara paling sederhana untuk menghindari keanehan ini adalah membiarkan sketsa utama Anda kosong (dan tidak menggunakan
.ino
file lain ). Kemudian buat tab lain (.cpp
file) dan masukkan barang-barang Anda ke dalamnya seperti ini:Perhatikan bahwa Anda perlu memasukkan
Arduino.h
. IDE melakukan itu secara otomatis untuk sketsa utama, tetapi untuk unit kompilasi lain, Anda harus melakukannya. Kalau tidak, ia tidak akan tahu tentang hal-hal seperti String, register perangkat keras, dll.Menghindari pengaturan / paradigma utama
Anda tidak harus menjalankan dengan konsep setup / loop. Misalnya, file .cpp Anda dapat:
Paksakan inklusi perpustakaan
Jika Anda menjalankan dengan konsep "sketsa kosong" Anda masih perlu menyertakan perpustakaan yang digunakan di tempat lain dalam proyek, misalnya dalam
.ino
file utama Anda :Ini karena IDE hanya memindai file utama untuk penggunaan perpustakaan. Secara efektif Anda dapat mempertimbangkan file utama sebagai file "proyek" yang menominasikan perpustakaan eksternal mana yang digunakan.
Masalah penamaan
Jangan beri nama sketsa utama Anda "main.cpp" - IDE menyertakan main.cpp sendiri sehingga Anda akan memiliki duplikat jika melakukannya.
Jangan beri nama file .cpp Anda dengan nama yang sama dengan file .ino utama Anda. Karena file .ino secara efektif menjadi file .cpp ini juga akan memberi Anda nama bentrokan.
Ya, ini mengkompilasi OK:
Namun Anda mungkin lebih baik mengikuti praktik normal: Masukkan deklarasi Anda dalam
.h
file dan definisi Anda (implementasi) dalam file.cpp
(atau.c
).Kenapa "mungkin"?
Seperti contoh saya menunjukkan Anda dapat meletakkan semuanya dalam satu file. Untuk proyek yang lebih besar lebih baik lebih terorganisir. Akhirnya Anda sampai ke tahap dalam proyek ukuran sedang hingga besar di mana Anda ingin memisahkan hal-hal menjadi "kotak hitam" - yaitu, kelas yang melakukan satu hal, melakukannya dengan baik, diuji, dan mandiri ( sejauh mungkin).
Jika kelas ini kemudian digunakan dalam banyak file lain di proyek Anda ini adalah di mana file terpisah
.h
dan.cpp
ikut bermain.The
.h
File menyatakan kelas - yaitu, ia menyediakan cukup detail untuk file lain tahu apa yang dilakukannya, apa fungsi itu, dan bagaimana mereka disebut.The
.cpp
File mendefinisikan (mengimplementasikan) kelas - yaitu, itu benar-benar menyediakan fungsi, dan anggota kelas statis, yang membuat kelas melakukan hal tersebut. Karena Anda hanya ingin mengimplementasikannya sekali, ini ada dalam file terpisah.The
.h
file apa yang akan dimasukkan ke dalam file lainnya. The.cpp
file dikompilasi sekali oleh IDE untuk melaksanakan fungsi kelas.Perpustakaan
Jika Anda mengikuti paradigma ini, maka Anda siap untuk memindahkan seluruh kelas (
.h
dan.cpp
file) ke perpustakaan dengan sangat mudah. Kemudian dapat dibagi antara beberapa proyek. Semua yang dibutuhkan adalah untuk membuat folder (misalnya.myLibrary
) Dan menempatkan.h
dan.cpp
file ke dalamnya (misalnya.myLibrary.h
DanmyLibrary.cpp
) dan kemudian menempatkan folder ini di dalam Andalibraries
folder dalam folder di mana sketsa Anda disimpan (folder sketsa).Mulai ulang IDE dan sekarang tahu tentang perpustakaan ini. Ini sangat sederhana, dan sekarang Anda dapat berbagi perpustakaan ini melalui beberapa proyek. Saya sering melakukan ini.
Lebih detail di sini .
sumber
Saran saya adalah tetap berpegang pada cara C ++ khas dalam melakukan sesuatu: pisahkan antarmuka dan implementasi ke dalam file .h dan .cpp untuk setiap kelas.
Ada beberapa tangkapan:
Atau, Anda bisa membuang IDE Arduino dan mencoba dengan Eclipse . Seperti yang saya sebutkan, beberapa hal yang seharusnya membantu pemula, cenderung menghalangi pengembang yang lebih berpengalaman.
sumber
Saya memposting jawaban hanya untuk kelengkapan, setelah menemukan dan menguji cara mendeklarasikan dan mengimplementasikan kelas dalam file .cpp yang sama, tanpa menggunakan header. Jadi, mengenai frasa yang tepat dari pertanyaan saya, "berapa banyak tipe file yang perlu saya gunakan kelas", jawaban ini menggunakan dua file: satu .ino dengan menyertakan, pengaturan dan loop, dan .cpp yang berisi keseluruhan (agak minimalis) ) kelas, mewakili sinyal belok kendaraan mainan.
Blinker.ino
TurnSignals.cpp
sumber