マクロをdo-while(0)で囲むワケ

こんな感じで書かれたマクロを見ることがある。

#define SWAP(x, y) do { int temp = x; x = y; y = temp; } while(0)

do-while(0)で囲んでいるのは、ブロックで囲まれていないif文での意図しない動作を防ぐため。
例えば、以下の場合に有効。

/* do-while(0)で囲まれていない場合 */
#define SWAP(x, y) { int temp = x; x = y; y = temp; }

if (hoge)
	SWAP(x, y);
else
	x = 0;

これは、以下のように展開され、文法エラーになる。

if (hoge)
	{ int temp = x; x = y; y = temp; }
	;
else
	x = 0;

文法エラーで済むのならいいけど、以下の場合には意図しない制御になり致命的。

if (1)
	if (1)
		SWAP(x, y);
	else
		;


ちなみに、if文を{}で必ず囲めば、マクロをdo-while(0)で囲む必要もなく全て解決。
ifは必ず{}で囲もう。


参考ページ
Super Technique 講座〜マクロの技

Processingで画像の色情報を取得するアプリを作ってみた

Processing触ってみたら、思いのほか楽しかったので簡単なGUIアプリを作成してみた。
画像を読み込んで、Ctrl+マウスで選択した矩形範囲のRGB平均値を表示するだけのアプリ。


こんなん。


hキーを押すと、ヘルプが表示される。

続きを読む

Ubuntuでsuを有効化

Ubuntuで、suコマンドを有効化する方法。
Electronic Genome - Ubuntuでsuを使えるようにする


Ubuntuはrootのパスワードが設定されていないから、suが使えないとのこと。

$ sudo passwd root

で、rootのパスワードを設定してやればsuを有効にできる。

12ステップで作る組込みOS自作入門(1)

仕事で組み込み開発をしていても、組み込みOSの深いところまではなかなか入っていけてないので、以下の本で組み込みOS「kozos」の学習を開始した。
独自OSを作ってみよう!


1stステップ:開発環境の構築

開発環境の構築は、クロス開発環境の構築 - ryochack.clipboardで行ったh8300環境がそのまま使用できる。


ハマったのが、H8/3069FのフラッシュROMへのh8writeでの書き込み。
こんなエラーが出て書き込めない。

$ sudo make write
FATAL:Can not open the line to the H8/OS system.


スーパー・ユーザ権限でやっても解決せず*1Ubuntuを再起動してもダメ*2


うんうん唸って、ダメ元でシリアルケーブルを全部接続し直したら、書き込みできた。

$ sudo make write
/usr/local/bin/h8write -3069 -f20 kzload.mot /dev/ttyUSB0
H8/3069F is ready!  2002/5/20 Yukio Mituiwa.
writing
WARNING:This Line dosen't start with"S".
Address Size seems wrong
WARNING:This Line dosen't start with"S".
Address Size seems wrong
.....
EEPROM Writing is successed.


シリアルケーブルの初期化あたりの問題かな?
とにかく、これでようやくスタートライン。



※シリアルケーブルを抜き差ししてもダメな場合は、 shintaさんが公開されている改良版の「kz_h8write」を試してみるのがいいと思います。

grep結果のquickfixからEnterキーで飛べるようにする

vimgrep後のquickfixリストは編集不可になっていて、いちいち編集許可を与えないとEnterキーでカーソル下の箇所へ移動できない。

それが不便でしょうがなかったので、以下を.vimrcに追記。

" quickfix: 編集許可と折り返し表示無効
function! OpenModifiableQF()
        cw
        set modifiable
        set nowrap
endfunction

autocmd QuickfixCmdPost vimgrep call OpenModifiableQF()


これですごく快適になった。
quickfixのヘルプドキュメント、知らないことばかりだったので今度ちゃんと読もう。
Google サイト


って、ちょこっと読んだら、以下の記載が。
":.cc" とかあったんだ…

QuickFixウィンドウには各行に1個ずつエラーが表示される。その行数はエラー番号に
等しい。":.cc"でカーソル下のエラーに移動できる。キーを押すのと行をダブ
ルクリックするのは同じ効果がある。そのエラーを含むファイルがQuickFixウィンドウ
の上に開かれる。

関数ポインタで型情報の異なる関数を実行する -引数省略-

これ、知らなかった。

‚b‚ł͈ø”È—ª‚̊֐”’è‹`fnc( )‚Ífnc(void)‚Å‚È‚­fnc(...)

C言語において
  int fnc( )
という引数を省略した表現は、
  int fnc(...)
という、引数がいくつあってもよい、という意味になる ... が省略されている状態であって
  int fnc(void)
のような、引数が一つもない、という意味の宣言ではありません。

続きを読む