次回のCompleteGetterバージョンアップでは、追跡するリンクを選べるようになります
(最初のページのみですが)。てか、本体はもう出来上がってます。後はポコポコと動作テストして・・・今週末〜来週頭までにはアップしたいところです。
徒然に戯言を述べる前提として、私がソフトウエア開発で使っている言語
(コンパイラ型)は
[ActiveBasic Ver2.x]、
[ActiveBasic Ver3.x]、
[Borland C++ 5.x for Win32]、の三つです。まぁ最初の2つは同じ言語で、バージョンが違うだけなんですが、仕様の変更が大きく、そのままでは移植できないことが多いので分けました。あまり
上位互換がないように私は思います。
で。
今回の追跡リンク選択ではリストボックスで選択するダイアログ表示の関数を作ったんです。まぁこれは何かと用途があると思うんで汎用性を考慮してコーデックしたつもり。で、汎用性を考慮したときに、まざまざと突きつけられること。それは
動的確保の重要性。
リストボックスを利用する関数で例をあげれば、幾つの項目が渡されるかは分からないわけですよ。10個かもしれないし、100個かもしれないし、1000個かもしれない。その全てに対応するためには、項目を管理する配列を動的に確保する必要が出てくるんですね。そりゃ、引数として渡される配列に直接アクセスして利用すれば、関数内で新たに確保する必要ないじゃん!って言うかもしれませんが(私も最初はそう思ってた)、何かと関数内でコピーを作る必要が出てくるんですよね、実際にコードを組んでみると。
で、CompleteGetterの本体は
[ActiveBasic Ver2.x]で作ってるんですが・・・こいつは、メモリの動的確保&メモリへの直接アクセスが非常に弱いんですよ _| ̄|○
[ActiveBasic Ver3.x]では実装されているGetDWord()
(指定したメモリに格納されているDWord型の値を返す)やらGetLong()を自力でコーデックするハメになりました。てか、malloc()も使えないから、APIのHeapAlloc()を呼び出してやる必要があるし
(Cのmalloc()もヘッダファイル内でGlobalAlloc()を呼び出しているとかいう噂ですが。ABのVer3.xも同様の記述をインクルードファイルに見つけたような・・・忘れたけど)。てーか、GlobalAlloc()使おうとしたら、なぜか全然別の場所にエラー発生したし(T_T)。HeapAlloc()で解決できたので、そっちのデバッグはやってませんけど。
でも、おかげさまでメモリ空間がまたちょっと見えてきた気がしますw 組んでみればGetDWord()の実装だってたいしたこと無し。1Byteずつ読み込んで連結して4Byteにするだけの話。GetLong()はそれをLong型にキャストすればOK。HeapCreate()で個別にヒープ領域を作成してHeapAlloc()で動的に割り当てたメモリは、1つずつ開放しなくても、HeapDestroy()でヒープ領域を破棄すれば自動で全部開放される、って技も覚えたし。これ、管理が便利。
[ActiveBasic Ver3.x]では随分とメモリ操作が楽になったのだけども、それでもメモリ操作をやればやるほど、
[Borland C++ 5.x for Win32]で使える [new] 演算子の便利さを思い知らされました。これって、こんなに便利な演算子だったんだ・・・。配列の動的確保時に違いがあらわになりました。普通は[先頭のアドレス+要素×要素あたりのByte数]でアクセスしなけりゃいけないんですが、[new] を使えば、要素当たりのByte数を気にせずに要素番号でアクセスできるんですよ。つーか、C++の強力さを改めて思いました。他にもポインタを示す [*] 演算子とか、逆に値をもってくる [&] 演算子とか、うわーい、こいつら実はかなり便利じゃねーか! 今まで「こんがらがる〜」って嫌っててごめんなさいm(_ _)m
ActiveBasic 本家での開発者様の発言で知ったんですが、こういう
「意味を持った記号の多用」がC言語の特徴らしいです。それゆえに、わかりづらい傾向にあるのも事実ですが、分かってしまうとかなり扱いやすいです。ActiveBasic でもVer4.x では new 演算子がサポートされているらしいですね。そのうちVer3.x からVer4.x に乗り換えようかな。こっちは上位互換を保証しているらしいし。
でも、なんだかんだいっても、
[ActiveBasic Ver2.x]を捨てる気はなかったりします。こいつ、
[Borland C++ 5.x for Win32]に比べて物凄く手軽なんですよ。使いやすい。一番のお気に入りはGetWndMsg()
(ウィンドウ・メッセージを得る命令)をWhile文でぐるぐる回してウィンドウを管理する、というスタイル。まさにシンプル・イズ・ベスト。仕組みが非常に分かりやすい。私はこれのおかげでWindowsプログラミングを理解できたようなものです。これが無かったらC言語でのウィンドウ管理を理解するのにどんだけ掛かったことか┐(−ε−)┌ 感謝感謝
(この発言はActiveBasic 本家の掲示板のNoWest様の発言と被ってます^^;いや、この方の発言を読んで「全く持ってその通り!」って共感したもんですからw)。
同様の理由で
[ActiveBasic Ver3.x]もこれからも使い続けますね。こちらは実行コード型
(Ver2.xは中間コード型だった)なので動作が軽快なのと、DLLを簡単に作れるのが魅力。
[ActiveBasic Ver2.x]からのDLLの呼び出しは簡単にできますからね。それと、Ver3.xではデバッガが随分と強力になったように思います。Ver2.xに比べてエラー個所(最近はアクセス違反を多発させてます^^;)の断定がはるかに楽です。
んでもって、
[Borland C++ 5.x for Win32]で組むこともまたあるでしょうね。これはこれで、細かい処理をやらせたら右に出るものは居ないし、汎用性の面でもトップでしょうね。動作もメッチャ早いしね。コンパイラにも依るんだろうけど、「業界最速」って噂もある。手軽に組めないのが難点だけど、できないことはない、ってとこがさすがプログラミング言語界の重鎮の貫禄ですね。
うーん、随分と語ったなぁ(^^;)まぁ何か間違ったことを言ってたら指摘してください。それ以外の呆れやらは「まぁ駆け出しのヤツは知ったかぶってみたいものさ」と温かい目(?)で見逃してください(苦笑)。