createWindowなどの基本部分をライブラリにしようと考えるわけだが…
2008-02-26 Tue 23:33
久々にマイライブラリを更新中。



DLLは創り方分かったけどとりあえず今は書かない。
で、.libにて初歩的な変わる事の無いcreateWindowなどの部分を行おうと作っているわけだが、
ウィンドウクラスの登録時にWndProcが必要じゃん。
WndProcも.lib内に作るか、外部から関数ポインタをもらわないとならないのか…でもゲームで使うのなんてたかが知れてるし、
WM_DESTROYだけちゃんと対応出来てれば良いのかこれ。
うーむ一から作る場合を完全に忘れているなぁ。
というか変わらんと言っても、exeにアイコン付けるなりマウスアイコン変えるなら改造が必要になるのか。
どうしたものかなぁ。


しかしWM_KEYDOWNにて処理を頑張って書いていた初のゲーム制作が懐かしい( ´∀`)
今考えればありえん(笑)
シーケンスも超グローバルなint型変数に0/1/2となんだか分からん数字を付けてたなぁ( ´∀`)
enumの存在すら知らなかったとか、ありえん(笑)

ちょこちょこ作り直して行こうかねヾ( ゚∀゚)シ
別窓 | プログラム | コメント:0 | トラックバック:0 | top↑
スタティックリンクライブラリを作ってみる
2008-02-24 Sun 15:21
会社での色々を見ているとライブラリってすげーなと思うことがあり、
.libファイルはどう創られているのかを実際に試して確認してみた。



ライブラリには2つの種類、
ダイナミックリンクライブラリ(DLL)、スタティックリンクライブラリがある。
自分の勝手な判断では、
DLLはexe実行時に読むため差し替えるだけで更新可能。
スタティックはビルド時にexeの中に取り込まれるため、ライブラリ自体が更新されたら本体も更新が必要。
という感じ。
DLLの方が親切っぽいけど、
間違って消したら動かなくなるし更新したらexe創りなおしでいいんじゃねって感じ。
まぁこの考え方間違いなのかもしれないけど。
ググり方が下手なせいでいまいち詳しく分からん…



てことで実際にVisual Studioにて.libを生成してみる。
長くなるので続きから。
スタティックリンクライブラリを作ってみる…の続きを読む
別窓 | プログラム | コメント:0 | トラックバック:0 | top↑
続々・文字列比較
2008-01-18 Fri 00:58
散々stringのfind関数使えねーとか思ってたら、
某環境では簡単にfind()してくれるというなんともな状況。


どちらが実際の挙動なのかは分からないが、

string word = "abcde";
string ng = "cd"; // JASRAC的な意味で
word.find( ng );

で返ってくる値は 2 のはずである。
家の環境では完全一致した場合にのみ 0 が返ってきて、
それ以外は全て -1 が返ってくる。
しかし某PCだとちゃんと 2 が返ってくるというね。


てっきり2バイト文字を含めたのが駄目なのかと思ったが、
家の環境で全て1バイト文字にしても結果は変わらず 0 か -1 のどちらか。
これはどちらが正しい挙動なのだろう。


まぁ要は動けばいいのである。
Windows環境だろうとLinux環境であろうと。
テストして2バイト文字だろうがエスケープ文字だろうが問答無用で検索できればそれでおk。
それでいいじゃない。
別窓 | プログラム | コメント:0 | トラックバック:0 | top↑
続・文字列比較
2008-01-17 Thu 00:48
なんか前頭葉というか頭が痛いわけです。
そんな状態で文字列比較第2弾。

とりあえずサンプルは前回のソースのまま。
今回はXPマシンでVS2003、VistaマシンでVS2005という2つの状況で調べてみる。


検査対象は
string.find()
string.find_first_of()
string.find_first_not_of()
の3つ。
そういえば後ろから読んでNG、というのは気にしなくていいのだろうか。


とりあえずfindメソッド関連の引数を調べて見る。
標準C++ライブラリ
検索にすぐ引っかかったページを参考にさせてもらう。
どうやら、
第1引数:調べたい文字列
第2引数:○文字目から調べるの○
第3引数:調べたい文字列の文字数
くらいのもののようだ。
基本的に戻り値は、その文字がある位置を返す数値らしい。

おそらく第1引数以外は指定しないとデフォルト値が入るから必要ないものだろう。
第2引数は指定しなければ最初から、第3引数は勝手に長さを調べてくれるものと思われる。


でも前回の結果にある変な数値はどうみても正しい戻り値ではないと思っていたんだけど。
続・検索結果

今回においても結果は同じ。
ようやく理解出来たが、これ検索文字の何番目の文字が検索対象に存在しているかが返ってきてるのね。
ptaなら検索対象にaがあるから0:p,1:t,2:aで2が。
cashなら検索対象にaがあるから0:c,1:a,2:s,3:hで1が、という風に。
くそ…納得するのに時間掛かりまくりんぐ。
と思ったらこっちでは違う結果が出ている模様
なんだこれ。
良く分からなくなってきた。
寝よう。


別窓 | プログラム | コメント:0 | トラックバック:0 | top↑
文字列比較
2008-01-14 Mon 01:14
変てこな状態の頭で考えてみるテスト。

■目的
特定文字をNGとするチェック処理を作る

■言語
nativeなC++。
標準で使えないライブラリは一切使用しない。

■仕様
文字は半角英数と記号のみとする。
NGワードに完全/部分一致していれば即アウトとする。
リアルタイムに使用する処理ではないので、速度は求められていない。

ちょっと用があって考えてみることにする。
stringに標準で付いてるfind()やfind_first_of()はなんか凄い検索結果になったので諦め。
VBとかperlみたく比較すること出来ないのかよ、とか思ったら、

char* strstr( const char*, const char* )
■第1引数
検索対象となる文字列
■第2引数
検索したい文字列
■戻り値
第1引数の文字列内に第2引数の文字列があった場合、そのポインタを返します。
見つからなかった場合、NULLを返します。

string a = "test";
string b = "es";
char *p = strstr( a.c_str(), b.c_str() );
pの中身は"est"
見つからないとNULL

なんていうものがあるんじゃないの。
てことは一番簡単な方法は、NGワードの数だけループ回してstrstr関数で調べればいいのね。
単純に考えればvectorかlistにNGワードぶっこんで、size()でfor回してstrstrの結果をifか。
vector/list< string > ng;
string word;
for( int i=0; i < ng.size(); ++i ){
 char *p = strstr( word.c_str(), ng[i].c_str() );
 if( p ){
  return true;
 }
}
ng[i]の書き方vectorしか出来ないな…まぁいいか。

■問題点
・strstr関数は大文字小文字を区別するため、何かしら手を加えないとならない
NGワードを大文字か小文字どちらかに固定して、
検索ワードをどちらかに変換してから調べるのが良さそうよね。
問題はstringからconstじゃない文字列ってどうやって抜き出すんだこれ。
c_str()でポインタもらってもconstだからいじれるわけではないし。
strcpyしないとならないのか…うーむ( ´,_ゝ`)なんか嫌だ。
てかVS2003.NETってstr関係の_sシリーズがないのか。
まぁ問題は起こらないだろうしコピって自前でtolowerとか使って変換処理しちゃえばいいかね。
案外なんとかなるものなのね、文字列処理。

・区切り文字が存在する場合それを削らないとならない
上記変換の時にこれ削るのはありとして、削る文字の候補とかも記憶しとかないといけないのねー。
ライブラリ使わないとなると、文字列を外部ファイルから読み込むのが面倒だなぁ。




てことで寝ることにする。
2バイト文字がこの手のものに使われることなんてほとんどないと思うのだが、
某お馬さんみたくカタカナという例も存在するわけでどうしたものかなぁ。
そういえば試してないけど2バイト文字の比較ってstrstrで出来るのか?
と思って調べて見たら出来るのね。
ひらがなとカタカナの混合だけしかチェックしてないけど。
なーんだstrstrで作れば全部いけるっぽいじゃなーい。
そこの人ライブラリ化しちゃってくださいYO
検索結果

別窓 | プログラム | コメント:2 | トラックバック:0 | top↑
| おっくん’s ROOM in blog |