C言語に限りませんが、大域変数はできるだけ使わない方がいいでしょう。もし使うなら、どの ように使われるのか、しっかり説明するなり、見ただけで使い方が分かるような名前にすべきです。 今回最悪だったのは、 int FCNT; /* ファイル数 */ int KCNT; /* 拡張子個数 */ int ERCNT; /* エラーフラグ */ int DFLG; /* 処理フラグ */の部分です。とくに、FCNTにはまいってしまいました。「ファイル数」とコメントされていますが、 場所により、バックアップ元とバックアップ先のファイル数になるようです。 元のプログラムの120行以降は、 FCNT = 0; strcpy( moji, B_DRIVE ); ret = FD_get( 2, moji ); cnt2 = FCNT; FCNT = cnt1; fd_fd_chk( cnt2 ); file_chek2();となっています。FD_getがさらにdir_shを呼びだし、そこでFCNTがインクリメントされ、戻ってき た時にバックアップ先のファイル数が求まっています。そして、fd_fd_chkとfile_chek2では、ファ イル数として、バックアップ元のファイル数が必要なので、FCNTにcnt1にセーブしていた値を代入 しています。他にも、こういう使い方が何個所かあります。 ファイル数は、当然「元」と「先」では異なり得るので、別の変数にする必要があります。まあ、 file_count_from, file_cout_toあたりが分かりやすいでしょう。こうするだけで、プログラムは相当理解し易くなるでしょう。 以上の部分は、 file_count_to = 0; ret = FD_get( FALSE, drive_to, &file_count_to ); fd_fd_chk( file_count_from, file_count_to ); file_chek2();とでも書けばよいでしょう。ドライブ名とそれぞれのファイル数は組にできるので、まとめて構造 体にしてしまう考えもあります。 ドライブの型の組み合わせを、大域変数DFLGで、 DFLG ドライブ1 ドライブ2 0x00 FD FD 0x01 FD HD 0x10 HD FD 0x11 HD HDと表現しています。この変数はmain関数の前半でセットされ、後半でswitch文による場合分けに利 用されています。さらに、後半で奇妙な使い方もされています。どうも、switch文を使いたいため に、1つの変数に組合せの情報を持たせたようです。こういう器用なデータの持ち方は、絶対に止 めましょう。 大域変数にすること自体の問題もありますが、以上4つの大域変数が極めて奇妙な使い方になっ ていることが、プログラムを超難解にしていた原因です。
|