a21_txt01_2の補足説明#2

  • (by K, 2021.02.05)

(0)

(1) getTc()をmallocを使って書き直してみると・・・

  • 以下のgetTc()では、変数tcBuf[]や変数tcbがいまいちピンとこないかもしれないと、今になって思いました。
  • だからもっと普通の書き方をしたらどうなるかを紹介したいと思います。
  • 書き換え前:
int getTc(String s, int len) // トークン番号を得るための関数.
{
    int i;
    for (i = 0; i < tcs; i++) { // 登録済みの中から探す.
        if (len == tl[i] && strncmp(s, ts[i], len) == 0)
            break;
    }
    if (i == tcs) {
        if (tcs >= MAX_TC) {
            printf("too many tokens\n");
            exit(1);
        }
        strncpy(&tcBuf[tcb], s, len); // 見つからなかったので新規登録.
        tcBuf[tcb + len] = 0; // 終端文字コード.
        ts[i] = &tcBuf[tcb];
        tl[i] = len;
        tcb += len + 1;
        tcs++;
    }
    return i;
}
  • 書き換え後:
int getTc(String s, int len) // トークン番号を得るための関数.
{
    int i;
    for (i = 0; i < tcs; i++) { // 登録済みの中から探す.
        if (len == tl[i] && strncmp(s, ts[i], len) == 0)
            break;
    }
    if (i == tcs) {
        if (tcs >= MAX_TC) {
            printf("too many tokens\n");
            exit(1);
        }
        ts[j] = malloc(len + 1);
        strncpy(ts[j], s, len); // 見つからなかったので新規登録.
        ts[j][len] = 0; // 終端文字コード.
        tl[i] = len;
        tcs++;
    }
    return i;
}
  • これで分かるように書き換え前のgetTc()におけるtcBuf[]とtcbの役割は、malloc()の代わりです。

こめんと欄


コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-02-10 (水) 16:31:09 (24d)