2015-12-17 18 views
0

我想在C中對任意類型的數組進行排序我正在使用空指針和memcpy指針。但是,我不斷收到錯誤,說明與memcopy函數關聯的「無效使用void表達式」,以及「void指針無效解引用」。我知道還有很多關於這個錯誤的其他線索,但是閱讀這些線程並沒有幫助我解決這個問題。我的代碼如下:無效使用memcpy在一個任意類型的空表達

#include "mysort.h" 
#include <alloca.h> 
#include <assert.h> 
#include <string.h> 
#include <stdlib.h> 

void mysort(int n, int elementSize, void * array, int ascending,CompareFunction compFunc) 
{ 
    //bubblesort algorithm 
    if (ascending == 1) 
    { int c,d; 
     void * swap = malloc(elementSize); 
     void * thing1 = malloc(elementSize); 
     void * thing2 = malloc(elementSize); 

     for (c = 0; c < (n - 1); c++) 
     { 
      for (d = 0; d < n - c - 1; d++) 
      { 
       memcpy(thing1, array[d], elementSize); 
       memcpy(thing2, array[d+1], elementSize); 
       if (compFunc(thing1,thing2) >= 0) 
        { 
         memcpy(swap, array[d], elementSize); 
         array[d] = array[d+1]; 
         array[d+1]= swap; 
        } 
      } 
     } 
    } 


    if (ascending != 1) 
    { int c,d; 
     void * swap = malloc(elementSize); 
     void * thing1 = malloc(elementSize); 
     void * thing2 = malloc(elementSize); 

     for (c = 0; c < (n - 1); c++) 
     { 
      for (d = 0; d < n - c - 1; d++) 
      { 
       memcpy(thing1, array[d], elementSize); 
       memcpy(thing2, array[d+1], elementSize); 
       if (compFunc(thing1,thing2) <= 0) 
        { 
         memcpy(swap, array[d], elementSize); 
         array[d] = array[d+1]; 
         array[d+1]= swap; 
        } 
      } 
     } 
    } 
} 

任何意見將不勝感激。

+3

你就不能解引用指針'void'爲你'數組[d]做' – ForceBru

+0

應該如何編譯器現在什麼類型它shoule被解除引用? (應該使用多少個字節?) – Keammoort

回答

1

如評論中所述,編譯器抱怨array[d]array[d + 1]。參數arrayvoid *,所以如果這些表達式有效,那麼它們將指定void類型的對象,這些對象不能存在。

但是,這只是一個潛在問題的症狀。您不希望首先將數組元素傳遞給memcpy()。相反,你想傳遞指向它們的指針。表達這些的最好方法可能是通過指針算術。例如:

memcpy(thing1, ((char *) array) + (d * elementSize), elementSize); 
+0

謝謝!使用這個方法,而不需要char轉換工作的指針 – Auburn

2

您不能像使用已知類型的數組那樣在void *上使用數組下標運算符。你需要投到char *並自己做指針算術。此外,您不需要thing1thing2。只需直接撥打compFunc即可與您要比較的元素。

所以更改此設置:

  memcpy(thing1, array[d], elementSize); 
      memcpy(thing2, array[d+1], elementSize); 
      if (compFunc(thing1,thing2) >= 0) 
       { 
        memcpy(swap, array[d], elementSize); 
        array[d] = array[d+1]; 
        array[d+1]= swap; 
       } 

要這樣:

在另一種情況下

而與此類似。

+0

雖然有些編譯器接受它,但C沒有在類型'void *'的指針上定義算術(因爲void是一個不完整的類型)。要保持在標準範圍內,您需要將其轉換爲指向完整類型的指針,例如'char *',並對其執行算術運算。 –

+0

@JohnBollinger謝謝。編輯。 – dbush

相關問題