[1093] Re:「体当たり学習」について
投稿者:yuya
2008/02/16 18:21:13
丁寧にお返事いただき、ありがとうございます。
【2】
> 私は、習慣的にマクロで値を定義するときは括弧で囲んでいます。
> 演算子等を含むと括弧が必要だったりしますから常に入れているというだけで、
> この場合は実用的な意味はあまりないですが。
了解しました。ただ、括弧のない箇所もたくさんあったので(p111など)、
統一性の観点から指摘させていただきました。
【4】
> たしかに対象読者を考えると厳しい気がします。
私自身、初心者に毛が生えた程度なわけですが、
率直に言って、この部分を見たとき、頭がこんがらかっちゃったんですよね。
「何をやっているか」は分かったものの、
「これで万事うまくいく」という確信がすぐには持てませんでした。
なんでスッと頭に入らなかったのか考えてみると、
(ア) ファイルを開く→書き込む→閉じるという順番でしかモノが考えられない(私が)
(イ) 「初め」の処理だけ特別扱いされている
の2点が原因になっているように思います。
(ア)な初心者としては、下のような手順が素朴に思い浮かびます。
------------------------------------------------------------------
while(){
書きかけの出力ファイルがなければ、新しいファイルを開く
文字を書き込む
出力ファイルが一杯になったら、ファイルを閉じる
}
最後の出力ファイルが中途半端なサイズで終わっていたら、それを閉じる
------------------------------------------------------------------
つまり、
FILE *out_fp = NULL;
while((ch = getc(in_fp)) != EOF){
if(out_fp == NULL){
out_fp = fopen(......);
......
}
putc(ch, out_fp);
total_size++;
if(total_size % OUT_FILE_SIZE == 0){
fclose(out_fp);
out_fp = NULL;
}
}
if(out_fp != NULL){ /* ここでは入力ファイルが空の場合だけでなく、
出力ファイルのキリのいいところで終わったときも
NULLになる
*/
fclose(out_fp);
}
てな構成にすれば、(イ)も自然に解消されるのではないでしょうか。
……と思って上のソースを見直すと、whileループの末尾と(次の回の)先頭で、
ほとんど同じ条件判断を行っていて非効率ですね(^^;)
ほかにも私の気づいていない問題点があるかもしれません。
【5】
> 動くか動かないかという点では動きますし、出力用のファイルポインタと
> 読み込み用のファイルポインタを比べると、読み込み用の方がfclose()しなくても
> 害が少ないわけですが(書きかけで異常終了すると変なファイルができる可能性が
> 高いですが、読み込みならまず大丈夫)行儀としては閉じた方がよいかと思います。
> # ただ、このレベルなら、やっぱり実用上「どっちでもいい」と言ってしまいそうです。
> # 私の場合。
こちらもよく理解できました。ありがとうございます。
風邪をひかれているのに申し訳ないのですが、もう一点、よろしいでしょうか。
【6】
3-3の detab.c についてなのですが、p141に
> タブストップが8の時、タブは、「その行の出力文字の総数が8の倍数になるまで」空白を出力します。
とあり、まさにタブの動作はこれで言い尽くされていると思います。
私の場合、単純にこれをそっくりそのままコードに翻訳することを考えてしまうわけですが、
そうすると例えば
do{
putchar(' ');
char_count++;
} while(char_count % TABSTOP != 0);
で済ませてしまうと思います。
これも素人ゆえの感想かもしれませんが、「出力すべきスペースの数を算出する」という方法は、
なんだか必要以上に事を複雑にしているように映ってしまうのですが、いかがでしょうか。
どうも勝手なことばかり長々と書き散らしてすみません。