プログラムの記事一覧

構造体の初期化、どっちが好き?

構造体を初期化するとき、どっちのやり方が好き?

typedef struct hoge{
	...
} HOGE ;

HOGE fuge ;

1) memset(&fuge, 0, sizeof(HOGE));
2) memset(&fuge, 0, sizeof(fuge));

1番はソースリーディング時、構造体と実体がイコールであるかチェックする必要がある。だから2番のほうが適切じゃないかなーと妄想。

ちなみにおいらは「HOGE fuge = { 0 } ;」が一番好きかな :-)

volatileの使い方

バグを生まないコーディング法、10個の規則でソフト開発を効率化(1/3) ― EE Times Japanで、一箇所だけ気になったのでコメント。

次の条件に当てはまる場合は、常にvolatile修飾子を使って宣言する。

(1)任意の割り込み処理ルーチンからアクセスされるグローバル変数を宣言するとき。
(2)2つ以上のタスクからアクセスされるグローバル変数を宣言するとき。
(3)メモリー・マップトI/O方式を採る周辺機器のレジスタ・セットにアクセスするためのポインタ変数を宣言するとき。例「timer_t volatile const *p_timer」。

 理由は次の通りである。コンパイラは、並列実行される複数のスレッドによって変更される可能性のある変数やレジスタであっても、それらに対する読み出し/書き込みコードが不要だと判断するとコード自体を削除するように最適化する場合がある。

 例えば次のような場合だ。あるスレッド「A」が、ある条件のときに変数の値を変更するとしよう。別のスレッド「B」はその変数をポーリングしていて、値が変更されたときに何らかの処理をする。このとき、スレッドBの中に変数の値を変更するようなコードが書かれていなければ、コンパイラはその変数の値は変更されないと判断してしまって最適化する場合がある。すると、コンパイル後のオブジェクト・コードでは、変数をポーリングするコードが削除されてしまったりする。volatile修飾子を適切に使うと、このようなコンパイラの最適化機能が無効となり、コード全体にわたるような発見が難しいバグの排除につながる。

(3)の場合はvolatileを使うべきだろうけど、(1)と(2)の場合はグローバル変数をvolatileにするのではなく、監視するタスク・関数内でvolatileな一時変数を用意し、そこにグローバル変数を代入して使うべきだと思うよ。

特に(1)の場合、割り込みルーチンから使用されるグローバル変数は、参照側のタスク・関数ではいつ変更されるのか全く予測できない事に注意が必要。

このため関数内での処理中にグローバル変数の内容が書き換えられることまで考慮するべきだから、積極的に一時変数に置き換えないとダメだと思うよ。

30日でOSができる?

30日でできる! OS自作入門

「プログラミングの基礎からはじめて、30日後にはウィンドウシステムを有する32bitマルチタスクOSをフルスクラッチで作り上げるという入門書。」だそうです。入門書なのに30日でフルスクラッチOSって目標高すぎない?でもOS作りには興味があるので、ちょっと読んでみたいな。

俺様httpd制作中

俺様httpd、ちょこっとずつバージョンアップ中。

ファイルシステムからファイルを読むようにして、Response Headerもそれに従うようにしたり、超簡易CGIも実装して GET に続くパラメーターを解析、表示に反映できるようにした。

設計の参考として、VC6のおまけについてるhttpサーバプログラムを読んでるんだけど、URLをパスに変換する時、返還前と変換後のパスの長さを比べている記述があって、意味が分からずしばらく悩んだ。

グルグルしながら色々調べて、「Windowsパス名の落とし穴」なんてのを見つけてようやく納得。

WEB表示用ディレクトリ+URL名をファイル名として単純に処理すると、表示用ディレクトリ以外の意図しないファイルが読み込めるようになっちゃうのか。ちゃんと対策を入れないと~。

VBのWebBrowserControlが面白そう

10日でおぼえるVisual Basic6.0入門教室

VBのWebBrowserControlって、オブジェクトとして色々操作できるのね。単に表示しか出来ないのかと思ってたよ。これなら色々遊べそうだな(にやり

Today's Bug

Yo! Ho! Everybody! What’s up today?今日は俺様の COOOOL で MARVELOUS な bug を報告しちゃうぜ! yo chki now.

void hoge() {
    a.WORD = *(unsigned long *)BUS_ADDRESS & 0xFFFF ;
}

32bitでバスリードして、下16bitマスクかけて、16bit のレジスタに入れたかったんだ。だけど、コンパイルしたら最適化の結果、見事に16bitリードにされてました OTZ

こういう時は、こうすると良いみたい。

void hoge() {
    unsigned long data_tmp ;

    data_tmp = *(unsigned long *)BUS_ADDRESS ;
    a.WORD = data_tmp & 0xFFFF ;
}

他人のソース解析中

ソースコードリーディングから学ぶ Javaの設計と実装

遂に他人のソース解析の領域まで来たわけですが。プロトタイプ宣言がなかったり、引数の数が足りなかったり、引数の型が滅茶苦茶だったりで目も当てられません。HEW君は良くこんなのを文句も言わずにコンパイルするね。

限界突破?VBがコントロール大過ぎで落ちた

10日でおぼえるVisual Basic6.0入門教室

ふんふーんと調子よく作業していたら、VBにコントロールの数が一杯だと告げられ「???」と混乱。

取りあえず一旦終了しようと無意識にセーブ。立ち上げなおすとロード出来ないと言われてゲンナリ。エラーログを見ながらフォームファイルのおかしな所を修正して何とかロード成功。やぁ一安心だと思ったら、タブコントロールが丸ごと消えてる orz

幸い数十分前にsyncしておいたデータがあったので事なきを得たけど、危ないところだったヨ

VBで0x00から0xFFの文字列を作り出す

ん~、VBで0x00から0xFFの文字列を作り出すスマートな方法がわからん。Cだとこんな感じのをやりたい。

for(i = 0; i < 0x100; i++)
    spirntf(Str,%02X,i) ;

結局こんな感じにしてるけど、イマイチだ

For i = 0 To &HFF
    Str = Right("0" + Hex(i), 2)
Next

Hexstr = "0123456789abcdef"
For i = 0 to &hF
For j = 0 to &hF
Str = Mid( Hexstr, i, 1 ) + Mid( Hexstr, j, 1 )
Next j
Next i

追記:それだと、やりたい事がパッとわからない気がします。なんかこう、ソースから直感的に意味が分かるような書き方にしたいんですよぅ。

実習C言語、読了

実習C言語 (スマート・スタディ・シリーズ)

読了。基本的な文法、配列、ポインタぐらいは頭では理解できたと思う。あとは実際にソフトを作ってみて、どこまで応用できるかだね。

C言語プログラマ必携かも?フリーな解析ツール「C言語関数ツリー」が良い感じ

C言語の解析用に、簡単に使えてフリーなツールを探していたときに「C言語関数ツリー」を見つけました。

Vectorに掲載されているソフト紹介文を引用します。

これはかなりおすすめです。C言語プログラマ必携!!!
DOS汎用。Windows3.1/95/98/NT/2000でも動作可。

C言語のソースを読み込んで、その関数の構成をツリー状にして画面に出力します。
タグジャンプも可能。ソース解析、ドキュメント作成に最適です。

使用方法 C>functree *.c
FUNCTREE.C 218 <0>main() メイン・ルーチン
FUNCTREE.C 160 ├<1>get_home_directory() コマンドラインから、自分のディレクトリを得る
FUNCTREE.C 135 │ └<2>usage() 使用法を表示(エスケープシーケンス未対応用)
TRE_CNFG.C 82 ├<1>read_configration() 書式の読み込み
TRE_CNFG.C 43 │ └<2>get_string() エスケープ文字の変換
FUNCTREE.C 70 ├<1>read_exclude_function_table() Cの関数、除外関数を読み込む
STRLIST.C 29 │ └<2>StrList_add() 新しい文字列の追加。(いちばん最後に追加される)
FUNCTREE.C 121 │ └<3>Alloc() メモリ・アロケーション

引用元:http://www.vector.co.jp/soft/dos/prog/se174432.html

ためしに、今回のソースを投げ入れたら、きれいにツリーを作ってくれて感激。

コメントが上手く読み込まれないけど、いいもの見つけたって感じです。

プログラマー's研究所/C言語関数ツリープログラマー’s研究所/C言語関数ツリー [公式]

TdfEditor for Windows、DLL同梱版を公開

ようやくですが、DLL 同梱版を公開します。バージョンもあがってちょっとだけバグフィックスしたよ。

変更点は以下の通りです。

  • FTPモードで存在しないディレクトリを作成するのに失敗していた不具合を修正。
  • コード最適化。ちょっとだけ実行ファイルが小さくなりました。
  • DLL同梱版も公開するようにした。

DLL非同梱版はもうちょっと待っててね。今ソフトウェア公開用のページを作成中なので、完成したらおいておきます。

入門C言語 新版

入門C言語 新装版  アスキー・ラーニングシステム

読了。とても読みやすく、分かりやすい本でした。C言語の基礎は理解できたと思います。続いて、「実習C言語」を買ってきて読んでみますか。

追記:確保出来ませんでした。ヨドバシにも三省堂にも売ってなかったよ。家に帰って、Amazonで頼むか。

C言語の勉強中

先輩から頂いた課題を幾つかやって見た。SJISの半角仮名を全角仮名に変換したり、BMPファイルを精鋭化処理にかけたりしてました。一応出来たんだけど、まだポインタの概念がしっくり来てないなぁ。

VBのクラス化を勉強中

Visual Basicによる制御実習入門―VBのみで機器制御プログラムが作成できる

Books Online を読んでるんだけど、なかなか理解しきれないところが多い。何かわかりやすい解説はと、探していて見つけたのが「CavalierLab」。「VB クラスモジュール講座」を読んで、随分と理解が深まったような気がします。

特に「クラスモジュール」と「コントロール」が同じようなものであるという解説で、一気に色々と分かってきた気がします。他にもオブジェクトとインスタンスの関係が、EXE のショートカットを作成するようなものという説明も理解を助けてくれました。

クラスモジュールの勉強中

C++クラスと継承完全制覇 (標準プログラマーズライブラリ)

今日はクラスモジュールのお勉強です。

用意されているクラスモジュールを使う事はできるけど、どう言う時にどの部分をどういう形でクラスモジュールにするのか?そこがまだ良くわからない。簡単な説明を読んだだけじゃ、実感がわかなくて「ここをクラス化しよう!」って気にもならないんだよね。とりあえず Books Online の「オブジェクト」の項目を読んで理解を深めることにします。

プログラミングのノウハウ

プログラムの勉強を始めて、はや2ヶ月。良く言われるプログラムのノウハウと言うのが、身をもって理解できるようになってきた。

関数名は型名を書いておかないと何の型なのか忘れるし、グローバル変数を使っていると変なところでハマる。処理を分散しておかないと、後で変更したいときや別の個所で使いたいときに困る。エラーチェックで手を抜くと、デバッグが大変。

少しずつでも身についてるから、プログラムの勉強としては順調なのかな。