[OSASK 4128] Re: kata1.8

  こんにちは、川合です。現在ちょぴり休養中なので、アドバイスを。

  まあアドバイスといっても、僕が好きでやっているだけなので、くー
みんさんが気に入らなければ無視して構わないのですが。以下の中で気
に入ったものだけを利用してください。

(1)USE_COLORあたりの簡略化

#ifdef USE_COLOR
int getcolor(const int blocktype);
#endif

という部分がありますが、これを以下のようにすれば、プログラムがす
っきりします。

#ifdef USE_COLOR
    int getcolor(const int blocktype);
#else
    #define getcolor(x) 8
#endif

こうすることで、getcolor(〜)は8に自動的に読み替えられるので、

#ifdef USE_COLOR
putmarkwin(6,1,0, getcolor(next1), getscr(next1));
putmarkwin(6,0,0, getcolor(next2), getscr(next2));
#else
putmarkwin(6,1,0, 8, getscr(next1));
putmarkwin(6,0,0, 8, getscr(next2));
#endif

という部分を、

putmarkwin(6,1,0, getcolor(next1), getscr(next1));
putmarkwin(6,0,0, getcolor(next2), getscr(next2));

だけにできるわけです。関数to_down()などはそのままですが。

(2)10進数変換はもっとスマートに!

  putmark()という関数がありますが、僕は以下の内容をおすすめいた
します。

void putmark(int mark)
{
    char markstr[9], *s = "strong!";
    int i;
    if (mark < 10000000) {
        s = markstr;
        markstr[8] = 0;
        for (i = 7; i >= 0; i--) {
            markstr[i] = '0' + mark % 10;
            mark /= 10;
        }
    }
    putmarkwin(9,1,8, 0, s);
    return;
}

  これでちょっとは小さくできるでしょう。またmy_itoa()という関数
は不要になりますのでコンパクト化が期待できます。

(3)関数getscr()の改良

  以下のような記述にできます。というか、配列が使える場面では配列
を積極的に使うのが一番いいです。ifやswitchにするのはもっともサイ
ズと速度を食います。

char *getscr(const int type)
{
    static char *table[4] = { "##", "$$", "<>", "[]" };
    if (-5 <= type && type <= -2) {
        return table[5 + type];
    }
    return "  ";
}

  もし、このtypeの値が、-5〜0の値しかとらないと分かっているのな
ら、getscrはもっと簡単にできます(もちろん速い)。

static char *getscr_table[6] = { "##", "$$", "<>", "[]", "  ", "  " };

#define getscr(type) (getscr_table[5 + (type)])

この#defineタイプを使う場合は、getscr()のプロトタイプ宣言部分と
差し替える必要があります。

(4)関数getcolor()の改良

  getscr()のときと同様に簡単に簡略化できます。

char *getscr(const int type)
{
    static int table[4] = { 12, 11, 10, 9 };
    if (-5 <= type && type <= -2) {
        return table[5 + type];
    }
    return 0;
}

  typeが-5〜0の値しかとらないと分かっているのなら、

static int getcol_table[6] = { 12, 11, 10, 9, 0, 0 };

#define getscr(type) (getcol_table[5 + (type)])

でいいわけです。

  続きはまた気が向いたときに。

  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/


ML番号でジャンプ
ML単語検索