2007年7月5日木曜日

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

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

ずっとC言語で構造化プログラミングしかしてなかった僕が
この本を読んでオブジェクト指向を勉強しました。

プログラムの歴史から書いてあり
なぜオブジェクト思考という考え方にいきついたのか?
という内容からはじまりUMLの基礎まで書いてありました。

かなりわかりやすく書いてあったので
これからオブジェクト指向を学んでいくという人にはお勧めです。

.

2007年7月3日火曜日

VC2005で作成したバイナリファイルのエラー

VC2005で作成したバイナリファイルを実行すると以下のエラーが出た。

「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。」

へ?
.NETFrameWork2.0はインストールしても同じエラーが出る。
なんで??
調べてみると、どうやらライブラリを動的にリンクかけてるっぽい。
Visual C++ ライブラリのランタイム コンポーネントをインストールする必要があるみたい
ということで取得してインストールするとばっちし動いた!

ダウンロード先
http://www.microsoft.com/downloads/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&DisplayLang=ja

アンマネージコードやと
コンパイルオプションの「C/C++」「コード生成」で
/MD オプションを /MT に変更すると大丈夫っぽいけど

マネージコードやと解らんかった。
なんか方法ないもんやろか?

.

2007年7月2日月曜日

テストの異常系について

ちょうど自分が異常系の定義について考えていた時に
「悪態のプログラマ」にこんな投稿がありました
異常系とは何であるか考えよう

自分の中での異常系の定義とは
・警告のダイアログを表示する
・エラーメッセージを表示する
のことやと決め付けてた。

自己定義が原因でプロジェクト内で意見が食い違っていたことが多々あり、
これじゃまずい!と感じて、異常系の定義をプロジェクト内で話あって認識を合わせた
このことによってテストの異常系を記述する際に悩まなくなったし、
テストシナリオにも統一性がとれて読みやすくなった。

そんな後で「悪態のプログラマ」でのこの記事を見つけて
異常系の解釈の違いがあるのは仕方ないことなんやとホッとしました。
それに、テストを想定して異常系の処理をあらかじめ決めておくことは
すごい重要なんですね。
ここは今まであやふやにしてきたところもあったので
これを気にしっかり決めていくようにしよう!

.

2007年6月20日水曜日

ウィンドウの生成

ウィンドウを作る手順。
1、WNDCLASSEX構造体にデータを設定する
2、RegisterClassEx関数でクラスを登録する
3、CreateWindowEx関数でウィンドウを生成

CreateWindowEx関数でRegisterClassEx関数で登録した
WNDCLASSEX構造体の情報をもとにウィンドウを生成します

CreateWindowEx関数
http://msdn2.microsoft.com/en-us/library/aa930455.aspx

HWND CreateWindowEx( //戻り値 ウィンドウハンドル
DWORD dwExStyle, // ウィンドウの拡張スタイル
LPCTSTR lpClassName, // 生成するウィンドウクラスの名前
LPCTSTR lpWindowName, // ウィンドウの名前(タイトルバーに表示されます)
DWORD dwStyle, // ウィンドウスタイル
int x, // ウィンドウを表示する X座標
int y, // ウィンドウを表示する Y座標
int nWidth, // ウィンドウの幅
int nHeight, // ウィンドウの高さ
HWND hWndParent, // 親ウィンドウハンドル
HMENU hMenu, // メニューハンドル
HINSTANCE hInstance, // 実行exeのインスタンスハンドル
LPVOID lpParam // 生成時のメッセージで渡す引数
);

CreateWindowEx関数のリンク先に
拡張スタイルとスタイルの渡すべき値(Define定義されているもの)の一覧が
載っていますのでそれを参考にしてスタイルを指定します

次回簡単な例でものっけよ

仮想関数(virtual)

テストプログラム作成したので貼り付けとこっと
C++のメンバメソッドにvirtual付けたときと付けない時の動作確認
C言語には無い概念…これめっちゃ便利やね。
一応関数ポインタを使えばC言語でも作れるんやけどめんどい!

--------------

#include

class Base {
public:
Base(){};
virtual ~Base(){};
void print();
virtual void vprint();
};

void Base::print()
{
printf("Base printf \n");
}
void Base::vprint()
{
printf("Base virtual printf \n");
}

class Foo :public Base {
public:
Foo(){};
virtual ~Foo(){};
void print();
virtual void vprint();
};

void Foo::print()
{
printf("Foo printf \n");
}
void Foo::vprint()
{
printf("Foo virtual printf \n");
}

int main (void) {
Foo* instanceFoo = new Foo();
Base* instanceBase = (Base*)instanceFoo;
printf("instance Foo\n");
instanceFoo->print();
instanceFoo->vprint();
printf("instance Base\n");
instanceBase->print();
instanceBase->vprint();
return 0;
}

--------------

2007年6月14日木曜日

ウィンドウクラスの登録

ウィンドウを作る手順。
1、WNDCLASSEX構造体にデータを設定する
2、RegisterClassEx関数でクラスを登録する
3、CreateWindowEx関数でウィンドウを生成

今回は
2、RegisterClassEx関数でクラスを登録する
です

RegisterClassEx関数について
http://msdn2.microsoft.com/en-us/library/ms633587.aspx
ATOM RegisterClassEx(
CONST WNDCLASSEX *lpwcx // ウィンドウクラスのポインタ
);
RegisterClassExに登録する前に WNDCLASSEX の各値を設定しておかないと
失敗する。戻り値に0(ゼロ)が戻ってきた時が失敗した時である
その場合は WNDCLASSEX で設定したウィンドウを生成することが出来ない

RegisterClassExで登録した WNDCLASSEX のデータは
アプリケーションを終了するまで削除されない

よって一度登録しておくと、登録したWNDCLASSEXのデータで
何度もウィンドウを生成することができる

完全なメモになってしまったや
まっいいかw

2007年6月13日水曜日

実行ファイルパス取得(C言語)

過去の投稿で.NETでの実行ファイルパスの取得方法を記述しました
http://mzs184.blogspot.com/2007/02/blog-post_21.html
今回はC言語での実行ファイルパスを取得する方法を紹介します。

といってもいたって単純です
main 関数の引数として渡ってきているのそれを取り出すだけです
----
int main (int argc, char* argv[]);
----
argv[0] に実行ファイルパス(絶対パス)が格納されています

main関数の args, argv については別のサイトで詳しく調べて下さい
面倒だーって人は以下のソースをコンパイルして出来上がった exe に
ファイルをドロップしたりコマンドプロンプトで引数をつけて実行してみてください
いろいろわかるでしょう。
-----
#include <stdio.h>

int main (int argc, char* argv[]) {
int i = 0;
for (i = 0; i < argc;++i) {
printf("%s\n", argv[i]);
}
printf("press any key");
getchar();
return (1);
}

----

今日はwinapiはちょっと休憩^^;

ラベル