Sahara's WebLog

日記のような、備忘録のような、うらみつらみのような、自慢のような…。

_LB(x)

_lb_TernaryConditional
ちょっと面白い作法を見かけたので、たまにはC言語のことも書こうと思う。
もちろん MPLAB X XC8、XC16、XC32 におけるC言語での話でC言語全般に通じる話なのかは知らない。

良く知らないけど、ただC言語だと思ってたら、実はいろんなのがあるらしい。
PICとかで使うCはその道のプロに言わせると亜種というか邪道というか、そんなものらしい。
そんなニュアンスな言い方をする方が通ぶって聞こえてかっこいいというだけのポーズなのか、確かにそうなのかは分らない。

いずれにしても超初心者のただの戯言、軽く流すか、お暇ならコメント欄にてアドバイスをいただけると幸いではある。

ともあれ、へえ、思ったのはこんな書き方。

RB10 を LCD の RS信号用に使っている場合に RS = Low にしたい場合の書き方だ。

まず、#define A B は、以後に登場する A を B に書き換えるという便利なことをやってくれる。
A の部分がプログラム中に複数あって、かつ変更する可能性が考えられる場合に、修正が1ヶ所で済んで便利だ。

なので、上の3行は結局は
LATB&=~(1<<10); となる。 1<<10 は 0b0000001000000000 なので、~(1<<10) は 0b1111110111111111 となって、これと LATB との AND を取るので、結局「LATB の 10ビット目だけを書き換えて 0 にする」が実現できる。 ならば、 LATBbits.LATB10 = 1; で良さそうなものだが、上に書いたとおり、これがプログラム中に何ヶ所もあるときには面倒だし、その数だけ間違える可能性が増す。 さらに、ほお、と思ってしばらく眺めてたのがこんな書き方。

これも、ポイントは書き換える部分が最初の4行の#defineだけで済むというメリットの追求だが、とりあえず分りやすくすると、

となる。 ここで、私には初見だったのが、 a ? b : c という書き方で、「a が真なら b を実行、a が偽なら c を実行。」という「条件演算子(Ternary Conditional)」というものだそうだ。 初めて見るとギョッとするが、知ってしまえば別に何でもない書き方だ。 結果、どうなるかというと、cmd の下位4ビットが LATB の12~15ビットに代入される。 うなったのは、このやり方なら LATBでの配置が連続でなくても容易に対応できることだ。 同じことを私が書くとこうなって、

LATB を飛び飛びに使うという場合には別のコードを書かなければ対応できない。

このエントリーをはてなブックマークに追加

Posted under: MPLAB X, PIC その他


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.