Professor (2015–現在) · 執筆者は1,258件の回答を行い、421.3万回閲覧されています · 更新日時:5年前
質問者です.
H31春の基本情報技術者試験
の問9(C言語)を解説するために,問題中のプログラムを実装しています.ところで,問題中のプログラム中に
- Swap(code[i], code[i+1]);
- Swap(freq[i], freq[i+1]);
という行が出てきます.その後,本文中に
Swap(x, y) は x と y の内容を入れ替えるために用意したマクロである
と書かれるのですが,マクロの定義は書かれていません.
素直に実装すると
- #define Swap(x, y) { long z = y; y = x; x = z; }
のような感じになり,本問題に対してはこれで十分ではあるのですが,このままでは
- if (condition)
- Swap(a, b);
- else
- /* do something */;
とされたときにコンパイルエラーになってしまうため,実用的なマクロとは言えません.そこで
- #define Swap(x, y) if (1) { long z = y; y = x; x = z; } else
というふうにマクロを定義したのですが,より良い解決法はあるでしょうか?
C++を使う,というのは無しで.
追記1: 問題文のSwapは引数が int, int
の場合と long, long
の場合の両方に対応しなければなりませんでした.sizeof(int)
≠sizeof(long)
の場合を考えてマクロ中のint
をlong
に書き直しました.
追記2: スラドでACさんから
- void swap(unsigned char *x, unsigned char *y, size_t s)
- {
- for (size_t i = 0; i < s; i++) {
- unsigned char z = x[i];
- x[i] = y[i];
- y[i] = z;
- }
- }
- #define Swap(x, y) swap((unsigned char *)&(x), (unsigned char *)&(y), sizeof(x))
という解法を教えてもらいました.
脚注
閲覧数:1,848回 ·
高評価を見る
· 1/6件の回答