Cで再帰の場合の引数
手元にあるCの本には、再帰する場合には値渡しせよ、と書いてある。なんでダメなんだろ?
うーん、リストの繋ぎ変えとかしたいからポインタ渡し(正確にはポインタのポインタ渡し)したいんだよね。っていうかすでにサンプルコード書いてて、ちょっと試した所だと問題なさそう。
本には他にも、内部変数は自動変数を使うこと、ってあったから単にポインタ渡しや静的変数使うと呼び出し先の変更が呼び出し元に影響を与えるよってことを言ってるのかな?
言語仕様を見てみるか。
| < | November 2007 | > | ||||
| Su | Mo | Tu | We | Th | Fr | Sa |
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | |
| 2005: | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |||||
| 2006: | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2007: | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2008: | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2009: | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2010: | 1 |

手元にあるCの本には、再帰する場合には値渡しせよ、と書いてある。なんでダメなんだろ?
うーん、リストの繋ぎ変えとかしたいからポインタ渡し(正確にはポインタのポインタ渡し)したいんだよね。っていうかすでにサンプルコード書いてて、ちょっと試した所だと問題なさそう。
本には他にも、内部変数は自動変数を使うこと、ってあったから単にポインタ渡しや静的変数使うと呼び出し先の変更が呼び出し元に影響を与えるよってことを言ってるのかな?
言語仕様を見てみるか。
C99で定義された複合リテラル使ってこう書いたらどう?
fish((param){.speed=2, .direction=180, .x=20, .y=20, .minDistance=16, .maxInflucence=40});
404 Blog Not Found:There's more than one way to set parameters
typedef struct {
int speed, direction, x, y, minDistance, maxInflucence;
} param;
# define FISH(p) fish((p).speed, (p).direction, (p).x, (p).y, (p).minDistance, (p).maxInflucence)
/* .... */
param p;
p.speed = 2;
p.direction = 180;
p.x = 20;
p.y = 20;
p.minDistance = 16;
p.maxInflucence = 40;
FISH(p);
プログラミング言語 C の新機能 とか見て、おーこんな機能があるのか!とか思い ながらよくよく見ると1999年に定義された機能とある。
おかしいなーなんで俺が持ってるCの本にはそういうの載ってないんだ?と思って、会 社においてある本を良く見てみると1998年改訂版だった。そりゃあ1999年に定義された 機能は載ってないわな。
試しに、大学のときに一番最初にCを勉強したときの参考書を見てみたら1986初版の 1993年刷のものだった。すげーふるー。そりゃぁ当時K&Rスタイルで書いてる人が結構 いたくらいの時期だからなー。
ちなみにいいなと思ったのは、
今持ってるのの最新版を入手しておこうかな。
|
新・C言語入門 シニア編 |
いまさらって感じなんでしょうけど(1999年の話?)、知らなかったし感動したのでメモ。
Cソースにデバッグ用にprint文を埋め込んだりして、不要になったら一斉に出力を止め たい場合には、これまでマクロで下のように書いたりして対応していた。
#define DEBUG
#ifdef DEBUG
#define DPRINT(x) printf x
#else
#define DPRINT(x)
#endif
main()
{
int x = 1;
DPRINT(("[%d] print文のテスト\n", x));
}
わざわざDPRINTの後に括弧が二組必要なのがうざったいなーと思いながら過ごしてきた けど、たまたま省略記号「...」についてググっていた時に以下のページを見つけた。
素晴らしい!可変個数引数を持つマクロが作成できるのだ!
#define DEBUG
#ifdef DEBUG
#define DPRINT(...) printf(__VA_ARGS__)
#else
#define DPRINT(x)
#endif
main()
{
int x = 1;
DPRINT("[%d] print文のテスト\n", x);
}
素晴らしい!素晴らしすぎる!!
これを書いた後に、「__VA_ARGS__」でググったら、同じような内容のものを見つけま した。__FILE__, __LINE__, __func__と組み合わせたマクロ定義が提案されています。