|
・今日の授業は情報処理論。引き続きグラフ理論。グラフの深さ優先探索とか。ってゆーかよく分かってない(汗)。今回はレポートが出たんで、それをすればだいたいわかるでしょう。たぶん。
・でわまたっ! |
・今日の授業は信号処理論。今日は Z 変換について。これまで「なんとなく」しか分かんなかったけど、今日色々考えてみたら少し分かったかもしんない(汗)。
・フーリエ変換のときは Exp(-jwt) だけだから単なる正弦波のスペクトルしか求まらないけど、ラプラス変換や Z 変換は複素平面上すべてを使えるから大きさや位相が違う正弦波も使えて、だから「この周波数だけ弱めたい」とかゆー場合には、その周波数にあたる Exp(-jwt) を複素平面上で弱める位置になるようにする……言っててわけわかんなくなってきた(汗)。 ・あと Z 変換がなんで単なる多項式になるのかとか Z^-1 の部分がなんで「ひとつ過去の値」になるのかとかまだいまいち不明。ってゆーか ^ を累乗記号として使うってのが C++ プログラマーにあるまじき行為(爆)。ってゆーかなんに使う記号だっけ……あービット排他的論理和ですかー。使わない(爆)。 ・でわまたっ! |
・今日はCマガの発売日。個人的には「クロスライブラリ」のが結構良かったです。ただ BeOS や Mac 用のもやって欲しかったなー(汗)。将来は KTL をクロスライブラリ化してすべての OS でたすかぶ使えるようにしたい(爆)。Cマガは特集中心にしてきたみたいで、書籍に対抗するにはいいんじゃないかなー。
・ MNG の関連だけど、ファイルのヘッダを読み込む時ってどうするのが定石なんでしょう。 #pragma pack( 1 ) も使って構造体に直接 read() ? わてはひとつひとつ丁寧にメンバに入れたり、配列に一度入れてからとかしてるけど、コードに冗長な部分多くなって見にくくてイヤーン。この辺の処理をうまくできるテンプレートライブラリを作りたいなー。 ・今日ふと思ったこと。サンプルプログラムだと関数だけで作ることが多いんだけど、そうすると先に呼ぶのを上に書かなきゃいけないでしょ。宣言部書くのも面倒だし(と、テンプレートライブラリクリエーターは思う)。で、ふと思ったのです。クラスメンバは順番関係なく呼び出せるなーと。 class C01 { void Second() { TRACE0( "Second\n" ); } void First() { TRACE0( "First\n" ); Second(); } public: C01() { First(); } }; // C01 ・……やりすぎですか?(笑) なんかクラス名がネームスペースみたいなのがいい感じ(爆)。残念なのは、「グローバル変数」としてメンバ変数を作っても、その場で初期化できないことですな。コンストラクタでせなあかん。まー作らなきゃいいんだけどー。あと関数ポインタ使うコードも書けない。意外と制約あるなー。 ・今日のお便り〜。 |
|
・そーそー、わてもポケコンとかの BASIC が先だから、 ^ をそー考えてしまうんですねー。数学関係のプログラム組むときいつも MSDN 見て pow() を探す(爆)。値の交換のは有名なヤツですな。でもまだ理解できない(爆)。交換よりまず代入できるってことがすごい。実際に使う機会ないって分かってても、わかんないとなんか悔しい(笑)。
・でわまたっ! |
・今日はプログラミングしてないからお便りだけ。では今日のお便り。
|
|
・いやいや、こーゆーこと考えつく人ってトリッキーなコードばかり考えそうなんで真似しない方がいいかも(爆)。これだって実際に使うの禁じ手だと思うし。意外に知らない人多いみたいだからねー(わてもどこで見たかは憶えてない……たぶんかなり昔)。プログラマーは普通が一番!(爆) んでもまだ理解できない(泣)。それはそれでプログラマー失格?
・でわまたっ! |
・今日はお休み〜。
|
・今日はお便りだけ。では今日のお便り。
|
|
・これは12日のですね。えっと、 CreateProcess() の最後の引数に PROCESS_INFORMATION 型変数へのポインタを渡すでしょ。 CreateProcess() を呼んだあと、この dwProcessId メンバにプロセス ID が入っているから、あとはこの前の「プロセス ID をしらみつぶしチェック」をすればOK。
・で、その方法について。まず EnumWindows() を呼びます。そうすると渡したコールバック関数が親ウィンドウの数だけ呼ばれます。そこで、そのコールバック関数の中で、渡されるウィンドウハンドルを GetWindowTreadProcessID() の第1引数に渡すと、第2引数にそのウィンドウのプロセス ID が返ってきます。それをさっき取得したプロセス ID と一致するかチェックします。 ・一致しなかったら何もしないで次のウィンドウを調べます。一致したらそのウィンドウハンドルに対して SendMessage() って感じ。 EnumWindows() の使い方が難しかったら GetWindow() でも取得できるから試してみて。それとも難しかった所って Knowledge Base J041632 のことかな。ページは MSDN で J041632 で検索すれば見つかるから。実際の使い方は、 CreateToolhelp32Snapshot() とかを goo とかで検索してサンプルコード探した方がいいかも。なんかこっちも支離滅裂(汗)。分かんなかったらまた訊きに来てね。 ・でわまたっ! |
・今日の授業は情報理論。でも相変わらず数学中心の話(汗)。確率関係の計算方法がまだしっかりできてないから、ちょっと謎な部分多数。むずー。……今日はこれだけ(爆)。
・でわまたっ! |
・今日の授業は情報処理論。今日は「データベース」、って言ってもいわゆるそーゆーのではなくて、配列とかを使って自分で作る場合のデータ構造とか、処理用のアルゴリズムとかの解説。この授業ってデータ構造についてはある程度教えてくれるんだけど、実際のアルゴリズムの組み方とか仕組みとかはかなりおざなり(汗)。もちっとしっかり教えてんかー。
・ってゆーか実際、アルゴリズムってちゃんとマスターしとかないとなーとかとは思うんだけどね。苦手分野だし。まだ誰もやってないから STL をフルに駆使したアルゴリズム処理の方法とかやってみようかな。アルゴリズムって C や Java を使ったものの解説書はいっぱい出てるからね。 STL 使ったらコード激減しそう、とか思うと笑みが止まらない(爆)。 ・でわまたっ! |
・今日の授業は信号処理論。分かってる人は退屈、分かんない人はつまんないこと書くけど気にしないで(笑)。
・まず複素平面について。 Z 変換すると Z には複素平面平面上の点を置けるわけだけど、これはそーゆーふーに考えないで rExp(f) つまり中心からの距離と角度だけで考えた方がいいっぽいかも。もちろんこれはさらに進めて正弦波の振幅・位相が違うものって考えるわけですね。 ・次にデジタル信号処理について。これまでフーリエ変換なんかは「信号」に対してのスペクトルとか求めてたわけだけど、デジタル信号処理は「変換処理するシステム」に対してフーリエ変換や Z 変換することになります。ただ、実際にはインパルス応答、つまり「システムを信号として表したもの」に対して Z 変換とかするんでその辺は同じ。システム上での「定数倍」を、インパルス応答に置き換えることで、信号としての値になるわけですな。 ・あとこの前の Z^-n と Z^-1 について。べき乗形式だから分かりにくいんで、これも結局正弦波って考えれば、正弦波のある角度での値を示したりしてるんですね。あと、 Z 変換する途中で総和を求めるのも、結局は「信号と正弦波を掛けた面積を求めてる」ってことを忘れなければなんとかなりそう。つまりいっちゃん最初のフーリエ変換をイメージして、そっから Z 変換までの「命綱」が途切れなきゃ、理解はできそうな気がする。やっぱ「フーリエの冒険」は偉大だ(爆)。 ・今日のお便り。 |
|
・これはふたつに分けて考えた方がいいかも。まず「ファイルからデータを取り込む」、次に「リストボックスにデータを入れる」。これをひとつずつクリアしましょう。
・まず「ファイルからデータを取り込む」方法。環境書いてないから C ランタイムライブラリを使う方法を書くと、まずデータを入れるための配列を作ります。このサイズは十分大きいのね。CSVってカンマ分割データのことだよね、配列はそのデータの種類の型。たとえば…… /* CSV のデータが aiueo,100,100 kakikukeko,200,50 (続く……) とかなら */ char ch1stAry[10000]; int i2ndAry[10000]; int i3rdAry[10000]; ・って感じに配列変数を宣言します。これは一番簡単な方法で、少し分かってきたら構造体やクラスで3種のデータをひとつにまとめたり、 10000 っていう指定を const int にしたり、さらにファイルサイズから動的に作ったりしてみて。で、次はファイルからのデータ取り込み。目的のファイルを fopen() で開いて、 fscanf() でデータを取り込んで、さっきの配列に入れていきましょう。 fopen() や fscanf() の使い方は MSDN や goo で調べればいっぱい見つかるから。C言語の本を見てもいいし。まーホントは fscanf() って使わない方がいいんだけど、簡単だからまずこれからがいいかな。 ・次はリストボックスにデータを入れる方法。クラスウィザードを使ってリストボックスを CListBox 変数に結びつけましょう。そしたらこの変数の InsertString() メンバ関数を呼び出して、さっきの配列のデータを渡しましょう。あれ? そいやリストボックスって文字列ひとつずつしか入らないよね。もしかしたらリストボックスじゃなくてリストコントロールかな? ・まーそんな感じ(汗)。ってゆーか、やっぱひとつずつクリアしていって、そこでつまづいたらまた来てくださいです。たとえば、CSVファイルからデータを取り込んで配列に入れて、それをアウトプットウィンドウに出力してみるとか、リストボックスの方なら、まず CListBox に結びつけて、ダミーの文字列を挿入してみるとか、そういうのを積み重ねていくのが大事じゃないかなーと。前者ならC言語の本、後者ならVCの本にやり方載ってると思うから、そーゆーのも参考にしてみて。 ・でわまたっ! |
・今日は昨日の続きで信号処理論の勉強をしてました。難しいってゆーより、最初の概念的な理解を、フーリエ変換から複素形式、 Z 変換まで維持するってことの方が大変(汗)。今日はホントに最初の方から色々見直してました。
・まず、昨日とか「 Z は正弦波で考えればいい」って言ってたけど、ちょっと違いましたね。まず、これは r( cos(f) + jsin(f) ) で考えないと計算が合わないですな(汗)。これは rExp(f) でも a + jb でも書けないといけないんで、三角関数の公式を暗算でできるようにならないときついかも。あー別にそのまま置き換えればいいんだけど、なんか納得いかないから。 ・で、これはただの「係数」。 r も f も実数ね。フーリエ変換や Z 変換はこの係数を求める式で、この係数を「 cos(wt) + jsin(wt) 」ってゆーある周波数の正弦波に掛けることで「ある振幅・位相・周波数の正弦波」が出てくる、ってのが逆変換の仕組みですな。この辺をしっかり頭に入れておかないと混乱しまくり(汗)。あと「変換」は面積を求めるので、「逆変換」は各周波数のを足し合わせるの、とか。 ・ってまー、ここのページの趣旨からもいちおー言っておけば、やっぱこーゆーのはプログラミングに生かさないと(汗)。 JPEG や MPEG (含む mp3 )が使ってるわけだからその辺と絡めてとは思うんだけどね。たとえば JPEG は圧縮率上げると赤色から汚くなってくるんだけど、それがなんでなのかとかしっかり理解して言いたいし。 ・Cマガにソースコードや解説あるんだけど、実際にやってみると符号化の部分がかなりいろんなことしてるんで、なかなか手を出せないっていうのが現状。それよりもフツーに WAV ファイルを使って処理の練習した方が楽かなー。ある周波数を強めたり弱めたり gnuplot 用に数値データ化したり。後期は Codian に追加できたら……。 ・でわまたっ! |
・今日はちょっとだけ。えっと、おとといのリストボックスとかのプログラム、ぷらとわでやろうかなと思ってます。この例ってプログラム作成のサンプルとしていい感じだと思うんで。つっても、まだやるの数ヶ月先だし、やってもフツーには進めない(爆)から、関連した部分で分かんないことあったら気軽に訊いてくださいです。
・でわまたっ! |
・今日はぷらとわを1話書きました。これからさらに忙しくなるんで、今書いとかないとあかんから。今日書いたのは「ローカル変数」。って、ポインタとかのあとに説明するってのもアレだな(汗)。今回もメモリウィンドウを使っての解説。それなりにうまく書けたかな?
・これが No.63 。予定では、参照とかの解説をしたあと、昨日言ってたのに入ろうと思ってます。久々に MFC モードってことで、ぷらとわらしく API と MFC の関係やコードの読み方とかを中心に書いていきたいと思ってます。道筋はできてるから、書くのは楽かな? ・でわまたっ! |
・今日はお休み。
|
・ごめん、2日続けてお休みだわ。
|
・今日の授業は情報処理論。んでも今日はとりたててアルゴリズムっぽいことはしませんでした。なんで書くことない(爆)。代わりにお便りが来たんでそちらを紹介しましょう。
|
|
・うんうん、この辺って DLL 扱う時って必ず気になる部分ですね。えっとまず、 DLL 内にあるクラスを使用する場合、普通に GetProcAddress() 使って呼び出すことは難しいと考えた方がいいです。「クラス」って型だからエクスポートと直接関係ないから、 GetProcAddress() 使うとしたら特定のメンバ関数に対してだよね。ところがこのメンバ関数呼び出すために、そのメンバ関数が属するクラス型変数のポインタ(つまり this に当たるもの)を渡さなきゃいけないでしょ。これを実装するにはアセンブラ使ってちょっとアレなコード書かなきゃいけないからおすすめしないです。
・じゃあどうするかっていうと、「クラスプラグイン手法」を使用します。これは COM が基本にしている実装方法。まず「純粋仮想関数だけのクラス」を設計します。次にそのクラスから継承した「純粋仮想関数すべてをオーバーライドしたクラス」を作ります。で、 DLL に普通の(非メンバ関数な)関数を作って、そんなかで「オーバーライドしたクラス」を new してそのポインタを返すようにします。 DLL を使う側はこの普通の関数を GetProcAddress() 使って呼び出して、その戻り値を「純粋仮想関数だけのクラス」型のポインタを用意して受け取ります。 ・こうすることで、純粋仮想関数を通して「関数ポインタを呼び出す」ことになるんで DLL 内のメンバ関数を呼び出せるとゆー仕組みです。問題点は、メモリ管理の都合上 delete も DLL 内で行わなきゃいけないこと( IUnknown::Release() のこと)、継承を含めてクラスの機能を思いっきり制限させられること。メリットは、呼び出すときにいろんな処理ができること。うまく使うとファイルレベルでのポリモーフィズムができます(メリットかな(汗))。 ・……ううっ、文章だけで説明するの結構難しいな(汗)。この辺の仕組みは Inside COM って本に詳しく書いてありますです。って、5200円もするのかこの本。よく買ったなわて(汗)。あともちょっと書くと、装飾名が変になるのは、属してるクラス名や、オーバーロードを解決するための引数とかの情報が加わっているんで、これを普通の C 関数みたいなシンプルなのにするのは無理ではないかなと。あと確か「 .def ファイルに書き込むための装飾名を出力する方法」があったような気が。あれ、 .exp ファイルに出るんだっけ、忘れた(汗)。調べて見てくださいです。 ・でわまたっ! |
・今日はお休み〜。
|
(C)KAB-studio 2000 ALL RIGHTS RESERVED. |