何かこの前、某授業でプログラムをやった。三週間で6コマだけ。
それもJAVA。
まずPATHを通すことから始まるし。
どうでも良いんだが…
1.2コマ目 Hollo,worldと計算、宿題も計算
3.4コマ目 for文、JAVAアプレットで簡単なお絵かき
5.6コマ目 if文、JAVAGUIアプリ、ボタン付き、宿題は作ったのをアプレットにして学内HPにアップ
見た目には楽に見える。いや、それは実際自分がちょっとでも、違う言語でも良いからプログラムをやったことがあるからだろう。
っても、Hello,world位ならどのプログラム参考書でも書いてあるし、そんな説明もいらないだろうけど…。
変数を使った計算はちょっと数学と勝手が違うしもうちょっと解説が欲しいかなとか思った。たいていの人はプログラムなんてやったこと無いだろうし。授業の資料ページには変数の型くらいしか説明ないし。
ただな…この日の宿題あるインターネット接続料金計算の問題。ダイヤルアップでの接続したときの料金計算なのだが仮想設定ではずいぶんレベルの低いランクで契約したらしく4時間までは980円、超過1分ごとに15円、HPスペースは150円/MBと言う設定。この条件の下、5時間接続、5MBのHPスペース。そしてプロバイダーまでは3分8円の電話料金(…ん? こいつはマイラインでも登録しているのだろうか?)。
条件はそんなに難しくはない。だが、何か違うところで詰まった友人が数人。プロバイダー料金とプロバイダーまでの電話料の違いが分からなかったらしいが…今はどんどんダイヤルアップが少なくなって、しかもダイヤルアップでも4時間までと言わず無制限の契約が大半を占めてしまったからだろうか、ピンと来なかったらしい。
3.4コマ目に至ってはやると言っていたfor文を解説すらしなかったため、マジで役に立たない授業のような気がしてきた。
さらにはコンパイルをちゃんとやってHTMLもちゃんと書いてあるのに(アプレットはブラウザ(IEとかネスケ)上で実行されるためからHTMLをを呼び出す)ネスケでリロードしても画面に変化がない。
それを「コンパイルがうまくいってないんじゃない」の一言で片づける(と言うよりは言い張ってた)お方がおられたし。ちなみにそれはShiftを押しながらリロードを押さなればいけなかったらしいが、それが皆に伝わったのは上記発言が何回も発せられた後だった。
ついでにソースの中にSetVisible(true)と言う関数があったのだが…問題3(だと思った)でこれを消したらどうなるかという問題があった。と言うことはコメントアウトして再コンパイルするだけで話が終わる。やってみる。…意味がない、と言うか変わらない。仕方がないのでその文を消してみる。変化無し。さて…ではtrueと言うことはfalseが在るはずだ。やってみた。変化無し。
結果、変わらない。答えはどうなるのかも結局言われた記憶ないし。
この後に宿題用アプレットを作ったときにもfalseを指定してみたのだが…ふつうに起動できるし。
5.6コマ目ではちゃんとif文をやったものの…GUIのボタンの部分とかの解説があまり無かった。
取り敢えず…教える方は教えることを理解してからやって欲しいもんだ。
少なくとも自分で作った問題の結果くらいは確認してから問題を作って欲しい。
とまぁ、授業の愚痴はこんなところで言いとして、ここからが今回の実験になる。
例のごとく突発的に実験したくなったのだ。
今回はsizeof()と言う関数を使った実験である。
この関数の引数はintとかlongとかの変数の型のサイズ(単位:byte)を調べてくれる。
これが返す値は処理系によって違うらしい。
BCC5.5.1ではどう返してくれるのかなと言うのが今回のネタである。
今回は前に実験で使ったtime実験の時のソースを書き換えて使ってみた。
取り敢えずint,long,byte,char,bool,WORD,DWORD,short,float,double位実験すればいいでしょ。
結果それぞれ4,4,1,1,1,2,4,2,4,8(上記の順番通り)。
…ちょっと待て。なんでintとlongで値が一緒なんだ?
intが4ってのは決して間違いではない(はず)。だいたいintって型はそのCPUが一番片づけやすいサイズ(32bitCPUなら32bitを一気に片づけられるので4byte)になっている(はず)。
で、僕が知っている所ではだいたいlongというのはintの二倍のサイズを持つと思った。
で、翌日友人とこの結果について話しているときにふと思った。
「いちいちWINアプリで作ったのだろう」、と。
そしてそのさらに翌日、今度はDOSコンソロールアプリで作ってみた。printfを大量に置いただけのプログラム。
こっちの方が管理が楽だ。
だけど実際コンパイルすると…WINアプリ=47.00KB、DOSコンソロール=51.50KB。
…うん。最初にWINで組んだのはこうなるって頭のどっかで分かっていたからなんだね。わかった? 納得。(な訳ねーだろ!!!)
ちなみにDOSでの実行結果も変わらず…つかそりゃそうだよな。
ただbyte,DWORD,WORDは取り敢えずチェックしなかったけど。
さて、では試しに今度はDOSの方の奴をASMコンパイル…
読み慣れないアセンブラソースをintelから仕入れてきたpdfファイルを見ながら見比べてもあんまり得るものはなかった。
だって、もうこの時点で入る数って決まってるみたいなんだもん。
さて…ここまで来てようやく調べてみる気になったMSDNライブラリ。
intで検索。英語だ…。
longもやってみて気づいたが、下の方にbase_typeと言うリンクがあった。
やっとここまで来て納得。
両方とも32-bit signed integer(32bit符号付き整数)って書いてある。
…そりゃどっちとも4って表示されるわけだよなぁ。
ってことはVCで実験しても同じ結果になるのかな?
友人に頼んでみようかな〜。
ちなみにMSDNライブラリ曰くhyper(64-bit signed integer)という型もあるらしいが、使えるか実験したらコンパイルエラーが出た。取り敢えず使えるようには設定されていないようだ。
なんだか本題と同じくらい愚痴の方が長いなぁ。
ま、いいか。
ちなみに今回のソースはここ。
それと例のごとくこれは個人的覚え書きメモです。