『Cプログラミング診断室』目次次(第3章 上司が問題 フラグ)

第3章 上司が問題

大域変数


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つの大域変数が極めて奇妙な使い方になっ ていることが、プログラムを超難解にしていた原因です。



Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング診断室』目次次(第3章 上司が問題 フラグ)