2016-04-06 3 views
0

私はCで、「一般的な」マージをコーディングしようとしています:、Cでの一般的なマージを書くvoidに値を割り当てることはできません*

void mergeSort(void *arr, int begin, int end,int size, 
    int (*comp)(void *, void *)); 

しかし、あなたがホルダー/一時配列を必要があるので、それはなり少しトリッキー。

int mid = (begin + end)/2; 
int len = end - begin + 1; 
void *pom = malloc(len*size); 

しかし、私はその配列に値を割り当てることはできません、それを回避する方法があります: 私は無効として、それを作成したので、*配列、その配列に値を代入する方法がわからないのですか?

i = begin, j = mid + 1, k = 0; 
while (i <= mid && j <= end) 
    **pom[k++]** = ((*comp)((char*)arr + i*size, (char *)arr + j*size) <= 0) ? arr[i] : arr[j]; 
while (i <= mid) 
    **pom[k++]** = arr[i++]; 
while (j <= end) 
    **pom[k++]** = arr[j++]; 

太い行がエラーを出します。

+1

'** pom [k ++] **'は確かに正しいC文法ではありません。 – Olaf

+1

おそらく、 'memcpy()'を使いたいでしょう。これは、任意の型のオブジェクトに/からコピーすることができます。 – EOF

+0

ヒント:文字列ポインタの配列をソートすることから始めます。ステップ2:voidポインターの配列に変更します。ステップ3)非文字列(例:structs)を指し示すvoidポインタに変更します。ステップ4)構造体などの任意のオブジェクトの配列に変更します。 – wildplasser

答えて

2

はい、sizeバイトをコピーする必要があります。

従って**pom[k++]** = arr[i++];memcpy(pom + size*(k++), arr+size*(i++), size);になり、他のすべてについて同様である。

関連する問題