One Note Jam

『Symbian OS C++ 実践開発技法』読書メモ (2005-06-30)

Symbian OSについて日本語で書かれた情報源は非常に少ないわけですが、そんな中『Symbian OS C++ 実践開発技法』という書籍が発売されました。とりあえず、流し読みして気づいたことなどをメモ。

CBaseクラスの定義について(p.6)

e32base.hを見ると、CBaseがコピーコンストラクタと代入演算子をprivate宣言していることが分かる。これは、クラスのクライアントが、間違ってそのクラスのオブジェクトの浅いコピーを作ったり、そのオブジェクトに代入したりするのを防止する手段として、一般に使われているものだ。

このテクニック自体は『Effective C++』にも載っている有名なものですが、大元のCBaseクラスでこれをやっているとは知らなかった。今までわざわざ自前でprivate宣言していました。

書き換え可能な静的データ(p.253)

以前の記事「Symbian C++開発・DLL内のstatic変数(2005-04-01)」に書いたこととほぼ同様の内容。やはり誰もがはまる落とし穴なのでしょうか。

(余談ですが、このサイトのアクセスログを見ると、"ERROR Dll has initialised data"といった検索ワードで検索している方がちらほら見受けられます)

便利なASSERT定義(p.299)

#ifdef _DEBUG
#ifdef ASSERT
#undef ASSERT
#endif
#define __ASSERT_FILE__(s) _LIT(KPanicFileName, s) _LIT(KPanicFileName,s)
#define __ASSERT_PANIC__(l) User::Panic(KPanicFileName().Right(12),l)
#define ASSERT(x) { __ASSERT_FILE__(__FILE__);
        __ASSERT_DEBUG(x, __ASSERT_PANIC__(__LINE__) ); }
#endif

このASSERTを使うと、パニックカテゴリ文字列が「ソースファイル名(の末尾12文字)」で、パニック番号が「(ひっかかったASSERTが存在する)行番号」のパニックを発生します。要は「ソースファイル名と行番号が表示されるASSERT」というわけです。「便利」といっても、他環境での一般的なASSERTでは当たり前のことではありますが……。

なお、上記のコードは本に記述されている内容をそのまま引用したものですが、ASSERTマクロの中身がマルチステートメントになっているのはまずいのではないかという気がします。例えば、以下のようなケースでコンパイルエラーになってしまいそうです。

if (...)
    ASSERT(...);
else
    ...

ちなみに、私の場合はこんな感じのASSERTマクロを使っています。

#define WIDE_LIT(lit)       L ## lit            // 文字列リテラルをワイド文字にする
#define WIDE_MACRO(macro)   WIDE_LIT(macro)     // 文字列マクロをワイド文字にする
#define MY_ASSERT(exp)  __ASSERT_DEBUG(exp, \
    User::Panic(_L("" WIDE_MACRO(__FILE__)).Right(16), static_cast<TInt>(__LINE__)));

ワイド文字がらみでプリプロセッサでいろいろ小細工をしていますが、やっていることは似たようなものです。

posted at 2005-06-30 | Permalink

Series 60開発・エミュレータ上でパニック情報を表示させる (2005-06-08)

パニック情報とは?

702NKでの開発で困っている点として、「パニック発生時にパニック情報が表示されない」ということが挙げられます。Symbian OS上での開発(デバッグ)において、パニック情報は非常に重要なので、これには悩まされています。

パニック(Panic)というのは、復旧不可能なエラーが発生した際にプログラムの動作を即座に停止させるものです。パニックの際には「パニックのカテゴリ(を示す文字列)」と「パニック番号」の2つの情報が得られます。システム側で発生したパニックであれば、これらの情報からパニック発生の原因がある程度わかります。また、アプリケーション側でも明示的にパニックを発生させることができるので、アサーションを行う際などにも使われます。

いずれにしても、パニック情報はエラーの原因を究明する際の足がかりとなる重要な情報です。ですが、前述のとおりパニック情報は表示されず、パニック発生時には以下のような表示になってしまいます。

パニック発生時の画面(パニック情報なし) 表示されるのはパニックが発生したアプリケーション名のみ。

これはエミュレータでの画面ですが、実機ではメッセージの表示すらなく終了してしまいます。

エミュレータ上では解決

そんな中、先日『Symbian OS/C++プログラマのためのNokia Series 60アプリケーション開発ガイド』(長い題名だ)のp.71にこんなことが書かれてあるのを見つけました。

パニック番号やテキストによるコンテクストメッセージの詳細を(中略)表示させるには、ErrRdという空のファイルを、\Epoc32\wins\c\system\bootdataフォルダに作成する必要がある。

さっそく記述に従ってファイルを置いてみたところ、以下のようにパニック情報が表示されるようになりました。

パニック発生時の画面(パニック情報あり) パニックカテゴリ("USER")とパニック番号(130)が表示される。

ちなみに、「USER 130」のパニックは、配列クラス(RArray)に対して範囲外のインデックスを使ってアクセスしようとした際などに発生します(詳しくはSystem panic referenceをご覧ください)。こういった情報があるかないかによって、デバッグの効率が大きく影響されることは想像に難くないと思います。

あとは実機上で……

これでエミュレータ上ではパニック情報がわかるようになったので、あとは実機上でなんとかなればいいのですが……。ちなみに、実機上でも同じようなこと(c:\system\bootdataフォルダに空のファイルErrRdを作成)をやってみたものの、結果は変わらず。何か方法はないものか。

posted at 2005-06-08 | Permalink

Series 60版「Rev.」開発中 (2005-06-01)

Series 60用「Rev.」開発中画面

せっかく購入した702NKですが、ここのところ時間がなくて放置状態です。月々の維持費がかかるおもちゃなので、遊ばせておくのはもったいない(高々月500円程度ではありますが)。

そういうわけで、Symbian OS・Series 60版「Rev.」の開発を再開しました。手始めに、Symbian OSのアプリケーションアーキテクチャに慣れる意味も含めて、画面まわりを手早く実装してみました(スクリーンショットはエミュレータ上のものです)。当初はオフスクリーンバッファを使ってちらつきを防ぐ処理を入れる予定でしたが、スクリーンに直接描画しても実機でほとんどちらつきが見られないので、とりあえずはこのままにしておきます。

盤面の描画以外の部分では、Symbian OSやSeries 60プラットフォームが用意している機能を活用しています。現在のスコアの表示にはナビゲーションペインのラベル表示を流用していますし、勝敗結果の表示にはノート(Windowsにおけるダイアログボックスに相当)を使っています。また、メニューまわりの処理はすべてアプリケーションフレームワーク任せで済ませています。使える部品が揃っていると開発が楽です。

残る最大の難関は、コンピュータの思考ルーチンです。指手を決めるための盤面評価処理は別スレッドで行う必要があるわけですが、マルチスレッドプログラミングとなるとなにかと面倒です。バグを入れ込まないように気をつけないと。

posted at 2005-06-01 | Permalink

© 2004-2008 ENDO