任意のタイプの 2 つの変数を交換できる c のロジックはありますか。つまり、int、float、一連の文字です。
すべてのタイプの変数を文字のシーケンスとして格納し、通常の文字列のように交換するロジックを考えることができますが、それは良い考えではありません。
char
2 つの変数に対してこれを行う方法を見てみましょう。あなたはこのようなことをするでしょう。
void swap(char* a, char* b)
{
char tmp = *a;
*a = *b;
*b = tmp;
}
2 つのint
変数の場合:
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
等々。さて、あらゆるタイプの変数にケータリングするために、次のようにしたくなるでしょう:
void swap(void* a, void* b)
{
// ...
}
ただし、パラメータ化されたサイズのスペースを割り当てる必要があります。そのため、最初にそのサイズをパラメーターとして受け取る必要があります。
void swap(void* a, void* b, size_t s)
{
// ...
}
...sizeof
式を使用して引数として渡します。そして、そのスペースを割り当て、それを使用して割り当て (コピー) を行う必要があります。頭のてっぺんからmalloc
/free
とmemcpy
頭に浮かぶので、上でchar
とに対して行ったことを行う大雑把な方法ですint
が、今回はパラメーター化されたサイズを使用すると、次のようになります。
void swap_any(void* a, void* b, size_t s){
void* tmp = malloc(s);
memcpy(tmp, a, s);
memcpy(a, b, s);
memcpy(b, tmp, s);
free(tmp);
}
私が説明したように、これは少し大雑把です。alloca
(スタックに割り当てます)と no で試してみてくださいfree
。
マクロは基本的にテキスト置換を使用して機能するため、( の代わりに)タイプをマクロに渡すことができるためです。size_t
次に、明らかに、次のように名前で一時変数型を作成できます。
#define swap_m(a, b, t) { t tmp = a; a = b; b = tmp; }
明らかに、関連する型に関する情報をまったく渡したくない場合は、それについてもっと工夫する必要があります。