What's New » この記事

今日のシールオンライン

よ~しヽ(´ー`)ノなんとか、+9にしてG化したのでやっと装備できるようになった(…タカをドナドナしたお金で)

ランダムペットミックス

吸血こうもり(ハズレ)…期待はしてなかったけど、本当に予想通りにハズレがくると腹ただしいの例ヽ(`Д´#)ノ ムキー!!

夜行観覧車

夜行観覧車
作者 湊 かなえ

原作の方読みました。いつもの悪意に満ち満ちたというストーリー展開ではないので、普通っぽい印象ではあります。ハッピーエンドが好きな人ならいいですが、後味の悪いバッドエンドを期待してるならあんまり勧め難いかもしれません。

スズノネセブン(画像アーカイブ用)アーカイブカッター

HG3形式の画像をスズノネセブンでも使ってるみたいなので、アーカイブカッターを作ってみました。Windows7環境なら展開できるかもしれません。

Download:[suzu_cut.lzh]

※画像アーカイブ以外のアーカイブの展開には使用できません。

ちょっと改造

最近キンドルを買ったので本読みだけでなく、ブラウザでネット閲覧もしてみました。使ってみて分かったのですが、タブレットだとブログみたいな縦長なものをスクロールしてるとトップに戻すのがなかなか大変なので、jQueryを使って300px程スクロールすると右下にトップにもどるボタンを表示させるようにしました。あると便利みたいヽ(´ー`)ノ

オブジェクト指向でなぜつくるのか -第2版-

[オブジェクト指向でなぜつくるのか 第2版]
作者 平澤 章

図書館にあったので借りて読んでみました。おおきな括りでOOPを説明しているので、ちょっと期待したのとは違いましたが、多態性に関して「ポリモーフィズムをズバリ表現すれば、共通メインルーチンを作るための仕組みです。共通サブルーチンは呼び出される側のロジックを1つにまとめますが、ポリモーフィズムは反対に、呼び出す側のロジックを一本化します(P.96より引用)」と説明されてて、なるほど~と思いました。C++の本にはどれにも多態性についての説明はされていますが、こう明快に言い切った本は読んだことがありません。代名詞で代名詞を繋ぐ様なものという感じで切り替え部分に重点を置いて今まで解釈していたので、認識を新たにするという意味で読んで良かったと思える本です。

WindowsSDK 備忘録 その十二

前回までで構文解析をさらっと通過したので、画面にビットマップ画像を表示するところを追加しています。

教本のCmdMascotSub();以降の部分になります。画像管理クラスを作成し、マップコンテナを作って複数HBITMAPを管理しています。

画像管理に関わるところは…
————————————————————————————-
CImageWindow::CImageWindowのコンストラクタ内で、
// 画像ファイルの読み込み
Images=new CImages();
Image=Images->GetOrNew(image_name);
の部分から、
CImage* CImages::GetOrNew(string file_path)へと渡り、
// 既存のオブジェクトがなければ新規に作成する
CImage* image=new CImage(file_path);
Images.insert(TFileImageMap::value_type(file_path, image));

によって、ここのコンテナに、”pmm1_ask”と、”新規に作成されたHBITMAP情報を持つCImage(単体)オブジェクトへのポインタ”を格納する。このコンテナImagesも静的に配置された(1個しか出現しないのでstaticではない。CImage[単体]のコンテナBmpsはマスコットが複数宣言されれば、その分存在する可能性があるので、コンテナも共用できるようstatic)
—————————————————————————————-
1つの画像に関して上の関係を整理すると、
Imagesコンテナ > Imageクラスのオブジェクトへのポインタ > HBITMAP > bmpファイル
という、関係になっていると解釈されます(左二つと右二つはそれぞれ別のマップコンテナで管理されてますが)

スクリプトindex.mctには、二つのマスコットを宣言してますので、画面には二つの窓が開くようになります。

以上、最小構成のつもりでマスコット宣言の処理の流れを追って教本の内容を整理しただけなのですがそれでも結構な量になっちゃいました。やっぱり大まかにWindowsとクラスの関係を把握するというのが目的なのなら、字句解析以降は省略して、一個の画像を表示するぐらいでコンパクトにまとめた方がおさまりが良かったみたいです。

P.S メモリリークをチェックするように途中からしましたが、これによってちょこちょこ今まで小さなリークの警告がでていたんで教本にはない後処理を追加しています。ただそれでもメモリリークが最後に一個残りました(;´Д`)
一つ目に読み込んだビットマップ画像に関係してると思われるのですが、それがどこかのタイミングでメモリ域に残るみたいです。二つ目のビットマップ画像に関しては残らないのでどうもよくわかりません。マップコンテナに複数画像のHBITMAPを持っているので、終了時にコンテナの中身をチェックしてHBITMAPが存在するなら、DeleteObjectするようにテストしてみましたが、はずれでした。このリークの警告に関しては、解決方法が残念ながらわからないです。残念(`・ω・´)

ソースコード[v11.lzh]

WindowsSDK 備忘録 その十一

トークンに分割する字句解析のところまで進んでるので、構文解析もさらっと流します。マスコット宣言についてのみ流れを追っているので、ParseLine();での字句解析が済むと、教本はCmdMascot();にて、マスコット文の種類の判別に進んでいます。このルーチンでParseExpression();という構文を判別するサブルーチンを行き来します。

教本でも、構文解析のところは難しいと思います云々書いてありますが、ParseExpression();辺りのコードは、チェックのための補助の関数をあちこち呼んだりする一方で、この解析が済むといよいよマスコットクラスのオブジェクトを生成するので、その前準備も必要になり、関数の数がまたまた増えます(マスコット宣言文に関係するコードだけに絞ってるのにね)( ´ー`)フゥー

制作メモでは…

制作メモ[v09] ———————————————————————————–

構文解析を行い、CMascotのオブジェクトを生成するのに伴い、Cvalue、CImage の両クラスも一気に作った。

▼CmdMascotSub(true, mascot_name, image_name, 0, 0);の直前まで
CInterpreter::CmdMascot()から、CInterpreter::ParseExpression()の構文解析部分で動きを把握する為、ログをかなり埋め込んだ。
CInterpExpr.cppの CInterpreter::NewStrConst()で、CStrValue型の配列の int型の 添え字StrConstsPtr を CInterpreterのコンストラクタで
初期化し忘れていたので、プログラムが誤動作した。ここを設定し忘れるとcase TK_STRING:のvalue_stack.push(NewStrConst(token->GetStrValue()));
から戻ってこれなくなる[先に進めなくなる]<==デバッカでスタックに「ぽもも」が二番目(一番目はダミー)の要素として入ってくるか確認する必要がでてくる。 ★例外クラスを追加[宣言…CLexer.h で、EScriptErrorとしてクラス宣言[インライン関数なので、CLexer.cppにはない]  例外クラスのオブジェクトは、CInterpreter.cppの先頭で7個生成。 ------------------------------------------------------------------------------- と、なっています。また、CInterpreter::Continue();では、構造が複雑になってきたので原文に従い、try~catch文を機能させるように戻しています。 分かりにくいところだと思います。なので、ログをいっぱいv09では吐いてます(;´Д`) ソースコード[v09.lzh]

レアペット進化イベント

はい、毎度おなじみレアペット進化イベントです。期待の★のダークパンプキンは紫バンピストになりました。ガ━━(;゚Д゚)━━ン!!

更に追い討ちをかけるように勇者ピヨは、超ピヨに。・゚・(ノД`)・゚・。もうヤダこのイベント。

WindowsSDK 備忘録 その十

制作メモ.txtに書いてあるところまで、マスコット文の宣言に関係するコードのみに絞ってみましたが、それでも一気にファイルが増えてしまいました。

字句解析をしてトークンに切り分けるところがv08で追ってるところです。ここはまだあっちこっち飛ぶとはいってもなんとかなるレベルですが、それでもねぇ…もぅ備忘録じゃねぇなこれは( ・∀・)ノ

制作メモ[v08] ———————————————————————————–

字句解析のCLexerクラスを追加。Utilites.cppにも補助関数を追加。
CInterpreter::ParseLine()の字句解析を一行分処理し、トークンを調べて、switch文に正しく分岐していかというところまで。

——————————————————————————-

ソースコード[v08.lzh]