了解しました。問題を明確に説明しようと思います。
要素のサイズと、要素内の変数のオフセットとサイズ(構造体で使用するため)に基づいて、任意の配列を並べ替える関数が必要です。
したがって、私の関数は次のようになります。
void sort(void* array, size_t elem_size, int elem_count, size_t operand_offset, size_t operand_size)
arrayは、配列の先頭へのポインタです
elem_sizeは、配列内の1つの要素のサイズです。
elem_countは、配列内の要素の数です。
オペランドオフセットは、並べ替えの基礎となる要素内の変数のオフセットです(要素が1つの変数のみの場合は0になりますが、要素が構造体の場合はさらに大きくなる可能性があります)
オペランドサイズはその変数のサイズです
この関数では、一時変数を作成する必要があります。次のようにします。
void* temp = malloc(elem_size);
*temp = *(array+ i*elem_size);
しかし、コンパイラは同意しません:void *ポインタを逆参照し、彼は私の一時変数のサイズを知りません...
私はそれをバイトごとに行うことができることを知っていますが、もっと良い方法があるかどうか知りたいです。
だから私の質問は:ポインタの「サイズ」をelem_sizeに設定する方法は?
追加の質問:サイズがわかっている場合、array [i]と入力して要素にアクセスできますか?
編集 OK、私の問題は解決したので、memcpyを使用する必要があります
しかし今、私は予期していなかった別の問題を抱えています。
要素内のオペランドのサイズとオフセットを考えると、どのようにそれを抽出して比較できますか?
ちょっと好き:
void *a = malloc(operand_size);
void *b = malloc(operand_size);
memcpy(a, array+i*elem_size + operand_offset, operand_size);
memcpy(b, array+j*elem_size + operand_offset, operand_size);
if (a < b)
...
else
...
どうやってやるの?
*編集2:* ええと、最後に、オペランドのサイズごとにifステートメントを管理するのは複雑すぎたので、まったく異なることをしました
つまり、基本的にvoid *array
n個の要素が含まれていて、それを並べ替える関数を書いていました。
ただし、要素内のオペランドのオフセットとサイズを直接指定する代わりに、2つの要素を比較する別の関数を関数に指定しました。それはうまくいきます
int compareChar(void* a, void* b);
int compareShort(void* a, void* b);
int compareInt(void* a, void* b);
int compareLong(void* a, void* b);
int compareFOO(void* a, void* b);
void sort(void* array, size_t elem_size, int elem_count, int (*compare)(void*,void*));