Ichi Kanayaさんのプロフィール写真

質問者です.

H31春の基本情報技術者試験

の問9(C言語)を解説するために,問題中のプログラムを実装しています.

ところで,問題中のプログラム中に

  1. Swap(code[i], code[i+1]); 
  2. Swap(freq[i], freq[i+1]); 

という行が出てきます.その後,本文中に

Swap(x, y) は x と y の内容を入れ替えるために用意したマクロである

と書かれるのですが,マクロの定義は書かれていません.

素直に実装すると

  1. #define Swap(x, y) { long z = y; y = x; x = z; } 

のような感じになり,本問題に対してはこれで十分ではあるのですが,このままでは

  1. if (condition) 
  2. Swap(a, b); 
  3. else 
  4. /* do something */; 

とされたときにコンパイルエラーになってしまうため,実用的なマクロとは言えません.そこで

  1. #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)の場合を考えてマクロ中のintlongに書き直しました.

追記2: スラドでACさんから

  1. void swap(unsigned char *x, unsigned char *y, size_t s) 
  2. { 
  3. for (size_t i = 0; i < s; i++) { 
  4. unsigned char z = x[i]; 
  5. x[i] = y[i]; 
  6. y[i] = z; 
  7. } 
  8. } 
  9. #define Swap(x, y) swap((unsigned char *)&(x), (unsigned char *)&(y), sizeof(x)) 

という解法を教えてもらいました.

脚注

この質問に対する他の5件の回答を表示