• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

元)零細社長のブログ一覧

2005年03月07日 イイね!

ワタシとC言語4【ポインタを激しく理解する】

前回までに、ポインタの何たるかを理解したワタシ。
しかし、使いどころは見出せずにいた・・・。
ポインタと言っても、そーいう型をした「変数」にすぎない。
要は代入したりしなかったりだもんなぁ。


そんなある日、
ふと、ほこりをかぶっている指南書をパラパラめくってみた。
そしてある一文に視線がロックされた。
「関数にポインタを渡せば、そのアドレスにデータを書き込めるのです」
!!!!
別の関数から、ローカルな変数にアクセスできる!!!!!
Σ(´Д`ズガーン



これで!
これで全ての謎が解けた!!
これこそ!ポインタの存在意義・・・!!!!

先の例
BOOL CListCtrl::GetItemRect( int nItem, LPRECT lpRect, UINT nCode )
のヨクワカンナイ第2引数「lpRect」はアドレス・・・というか、Rect型の空っぽの箱を渡しているのだ!(それはわかってたはずだったが)
この関数の中でlpRect = HOGEHOGEとやっているんだろう。空っぽだったlpRectには、この関数から抜けたときにはめでたく目的のデータが収まっているのだ!!!!(これも結果だけはわかってたんだが)
すげぇ!!!ポインタすげぇえええええ!!!!!!
まるで生CD-ROMにデータを焼くようじゃないか!!!



そう!配列も!!
先頭アドレスだけ渡せば、別の関数でまるごと処理できる!!!

よくよく思い返せばWinAPIには、「戻り値は成否のBOOL」で、欲しいデータは「ポインタ渡して焼きこむ」関数が多い。
だから、例えば(これも初心者泣かせなんだが)
if( GetMyName( pChar ))
{
printf(pMyName, "%c_%d", pChar, nID);
}

なんてコードがあったりする。
これを見ると初心者は
「はい???えーとこのGetMyNameTRUE/FALSEのための関数だろ?じゃあ名前は一体どこで・・・?」などとあちこち探すんだが・・・。

違うんだ。
ポインタなんだ。

ポインタ渡して、成否ジャッジと名前取得を同時にやってるんだ。
これがC言語の醍醐味なんだ。
美しい・・・なんて・・・エレガントな仕様なんだ・・・。
これ考えたヤツはヘンタ・・・いや天才だ・・・。
漏れちゃん激しく尿漏れ。

まぁ前回の時点でよーく考えれば行き当たりそうな結論だったんだけど(゜∀゜)

ワタシはここに断言する。
ポインタ理解せずしてC言語は語れないと。


------- 完 --------

そして今。

今、組んでるプログラムが上手く動いてくれなくて、気分転換に書き始めたら連投してしまった。
そろそろ戻るか・・・。
いつのまにか直ってないかなー (T-T)
Posted at 2005/03/07 02:38:13 | コメント(3) | トラックバック(0) | プログラム | パソコン/インターネット
2005年03月07日 イイね!

ワタシとC言語3【ポインタを理解する】

前回は「C言語の不思議な仕様」に触れた。

ポインタをわけもわからず使っていてモヤモヤしていたワタシ。
「住所」だの「電話番号」だの「アドレス」だの言われても
「じゃあ例えば、int *pItemNum には、メモリアドレスの00A9F36Aなんていう数字が入っているんだな?てことはポインタってのは要はアドレスが記録された32ビットの変数なんだな?」などと考えていた。一応アセンブラはかじって挫折したことがあるのでメモリ云々は理解できたのだ。思えばこの半端な知識がまずかったのかもしれないが・・・。

そんなある日、とある初心者向けサイトでこんな文章を見つけた。
「今までのポインタの知識は捨ててください」
むむ!?
「指南書などで『住所』などと覚えているのではありませんか?」
むむむ!!!
「ポインタとはなのです。」
なに!?
int *iMaxと書くから分かりにくいのです。これはint* iMaxと書くべきです」
Σ(´Д`ズガーン


まさに天啓だった。
そう、ポインタには32ビットのアドレス16進数が入ってるわけじゃない。
int* float* char* はてはD3DXVECTOR3*
みんなそーいう型なのだ!!!
そーいう大きさを確保した型なんだ!!
だから配列でも、添え字の数字をひとつ足せば、次の変数にシフトするんだ!!

これで納得した!!
「住所」とか「電話番号」とか言われるよりずっとイメージしやすいぜ!!


これで指南書によくある謎のキーワード、「配列の先頭アドレス」に関してはスッキリした。
ただ、
サンプルソースを読み解く分には役に立つレベルアップだったが、
これだけではポインタにそれほど存在意義を見出せなかった。
配列だって、「そーいう型が並んだモノ」と捉えればポインタなんぞ意識せんでもいい。

だが・・・
だが、違うんだ・・・
この時、ワタシはまだ、もっと重要で美しい、C言語の醍醐味がすぐそこに隠れていることに気づいてなかったのだ・・・。
Posted at 2005/03/07 01:01:35 | コメント(0) | トラックバック(0) | プログラム | パソコン/インターネット
2005年03月06日 イイね!

ワタシとC言語2【ポインタとの出会い】

私のコーディングスタイルは、
「必要なものしか勉強しない」。
作りたい物に必要なことを調べて、必要でないものは勉強しないし使わない、だ。

多くの初心者がそうであるように、ワタシも最初、「ポインタ」は理解できなかった。
文献によくある説明、データの「住所」?「電話番号」??はい???
そもそも何のためにそんなややこしいものが用意されているのか?
データの中身が知りたけりゃ直接変数使えばいいじゃん?あほか。

そしてワタシは判断した。
ポインタなんぞ使わずにコーディングしてやる。と。

事実、
メンバ変数を多用したり、独自構造体をでっちあげれば不可能ではない。自作関数に関しては。

そう、ANSIやWinAPIで用意されている関数に関してはポインタは避けてとおれない。
例えば
BOOL CListCtrl::GetItemRect( int nItem, LPRECT lpRect, UINT nCode )
というクラスがある。リスト内のアイテムの枠の大きさを取得するクラスだ。
普通、BASICあたりから来たプログラマは、これを見て2つの点でとまどう。
戻り値に目的の「枠の大きさ」が戻ってないという点。
もうひとつは第2引数 lpRect
このlpRectは俺が知りたい「枠の大きさ」だぞ?
なんで、戻り値じゃなくて引数として与えるんだ??
そしてよくよく調べると、なんかよく分からんが空の変数をここにぶち込めばいつのまにかここに「枠の大きさ」が入ってるらしい。なんで??つーかどうやって?

しかし、それもヘルプ見たり、適当に「&」つけたりして(おいおい)上手く動いた。
C言語ってなんかややこしいな・・・。まぁ動いてるからいいか。


だが、
ワタシはこの時まだ気づいていなかったが、
これぞポインタなのだ。
Cプログラミングの醍醐味に接していたのだ。


次回「なんちゃってプログラマー、ポインタを理解する」に続く
Posted at 2005/03/06 20:25:43 | コメント(5) | トラックバック(0) | プログラム | パソコン/インターネット
2005年02月20日 イイね!

ワタシとC言語【ブレークスルーの瞬間】

過去ログにもあるが、ワタシはいつの間にかプログラムを書けるようになった。
2年前までは「やりたい・・・。けどおいらの脳みそにCが理解できるわけがない・・・」と思っていた。

しかし、どうしても
どーーーーーしても
欲しいツールがあって、それは自分で作るしかない・・・。
それに
「プログラム組めるデザイナーってかっこよすぎ」だし。

こうなったらやるしかない。
千里の道も一歩から。
今度こそマジで勉強すると決意し久々にVC++を立ち上げたのが1年半前。お盆休みだった。

まず、簡単なレベルの「作りたいソフト」を定めて、サンプルコードを集めた。
そして、それをあれこれいじるわけだが、これが苦労する。
このトークンが定数なのか変数なのか、標準APIなのか自作関数なのか素人にはサッパリ分からないわけですよ。型宣言ですら自作か標準なのか分からないのです。
分からないとヘルプの調べ方も手間取るのです。
そこでまずANSIやAPIの関数を見つけ次第片っ端から登録していった。
色分け表示するためだ(ちなみにフリーのテキストエディタね)。
WindowsAPI独自の型も登録した。
かくしてなんともカラフルなコードが表示されるようになったが、これはすごく役に立った。これが最初のブレークスルーだった。

コードの読み方が分かるようになると、俄然面白くなり、仕事が終わってから家でも夜遅くまで勉強するようになった。


動機が強ければ不可能など無い。
何かに挑戦する人よ。がんがれ。

次回「ブレークスルー2・ポインター」に続く。
Posted at 2005/02/20 03:03:56 | コメント(3) | トラックバック(0) | プログラム | パソコン/インターネット
2005年02月04日 イイね!

今日のメモ

・頂点座標もライト設定も問題ないのに表示されねぇ!!というとき。
FVFの型指定をチェックせよ。

【重要な発見】
Renderには順序がある?
ポリゴンオブジェクトにはXFileオブジェクトと手動プリミティブオブジェクトがあるが、
プリミティブレンダリングはXFileが終わってからの方がいいようだ。
XFileの前と後ではレンダリング結果に違いがある・・・。




↓の流れがホイール屋の通販ページみたいになってしまった。
Posted at 2005/02/04 01:59:35 | コメント(0) | トラックバック(0) | プログラム | 日記

プロフィール

みんカラ新規会員登録

ユーザー内検索

<< 2025/9 >>

 123456
78910111213
14151617181920
21222324252627
282930    

リンク・クリップ

有楽町丸井 
カテゴリ:脱キモオタ
2007/09/15 15:55:54
 
Elastic 
カテゴリ:脱キモオタ
2007/02/13 00:55:22
 
スタイルコネクション 
カテゴリ:脱キモオタ
2007/02/13 00:33:58
 

愛車一覧

日産 180SX 日産 180SX
おっさんなのに180sx
© LY Corporation