2016/09/27

Arduinoっぽいコーディングを調べる

Arduinoライブラリを作ることになったが、そもそもArduinoをあまり使ったことが無い。
どういうルールで書くとそれっぽくなるのだろう?

 

Arduino - StyleGuide
Arduino - APIStyleGuide
短いけど、読みづらい。。。。
幸い、日本語で訳している人のページがあった。
他のライブラリを見た調査もあって、ありがたい。

Arduinoのコーディングルールと命名規則を調べてみた - Qiita
「個人的にあまり納得のいかないルールもあった」ということだが、どれどれ。。。

ああ、なるほど。
ちょっと、すっきりしないな。。。
まあ、C/C++言語ではなく「Arduinoで使う言語」と割り切るのがよいだろう。

 

整数型の型として、uint32_tのようなものではなく、unsigned longなどを使うよう推奨している。
間違えそうなので、メモ。

整数型以外は省略する。

普通のGCCを使っているようなので、uint32_tなども使うことはできる。
が、推奨はしていないので、少なくともAPIとしては使わない方が良いだろう。

 

また、引数でポインタを取るくらいだったら配列で指定するよう推奨している。

int getName(char *pName)  -> int getName(char[] pName)

配列を引数に取る関数って、そういえば書いたことなかったな。。。
どっちにせよ、C言語としては値渡ししかないので、アドレス値が渡されるだけのことだ。

だまされたっ!

int getName(char *pName)  -> int getName(char pName[])

C/C++なんだから、配列の括弧は名前の後ろじゃ。
公式サイトが間違っているのだけど、なんでこのままになってるんだろう?
実はみんな、普通にポインタで渡してるんじゃないのか??

 

あれ、ということは、参照でもらうのはよろしくないということかい。。。


気になっていることとして、文字列をどう扱うのがよいか、というものがある。
char配列がよいのか、std::stringがよいのか。。

Arduinoのリファレンスページを見ると、「string」と「String」があった。
stringは型ではなくて、char配列を指していた。
Stringはclassで、あるバージョンから使えるようになったらしい。

 

char配列の方は、普通のchar配列のようだ。
でも、一番下にあるExamplesで、

char* myStrings[]={"This is string 1", "This is string 2", "This is string 3", "This is string 4", "This is string 5","This is string 6"};

となっていた。
"文字列"のところは文字列定数だから、const型なのだけど、const無しで受けている。
g++でコンパイルしてみると「deprecated conversion from string constant to 'char*'」の警告が出る。
いくらC言語初心者でも扱えるようにとはいえ、あまりよろしくないと思う。
「お、char型だから書き換えられるやん」、と思って変更すると、ROM領域へのアクセスになるから、何も起こらないか、不正アドレス操作で死んでしまうか、そういう期待しないことになるだろう。

 

一方のString型だが、c_str()があるなどstd::stringっぽい。
新しく作ったということは、こっちを使ってほしいのだろうか?

いや、今回ね、APIから文字列を返すことになるかもしれないのだ。
一時的な文字列だったらライブラリで文字列のメモリを持ちたくないので、戻り値ではなく引数で受け渡しすることを考えていたのだ。
その際に、char配列がよいのか、Stringオブジェクトを参照でもらうのがよいのか、迷いがある。

中身をもらう必要は無いので、コピー渡しにはしたくない。
だから、ポインタか参照で考えていたのだけど、Arduinoで参照型を使っている例があるのかなあ。

それに、私のルールでは、constの参照渡しはするけれども、値を書き換える場合はポインタで渡すようにしていたのだ。
見分けが付きにくいから、というだけの理由だが。
C#みたいにoutとかあるといいんだけどね。

 

うーん、もう少し悩んでみます。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。