2012-03-30 112 views
0

我必須寫一個交換功能爲我的冒泡排序 這就是我已經有了:交換實現函數c

void swap(int arr[], int size, int i, int j) 
{ 
    int temp = *(arr+i); 
    *(arr + i) = *(arr+j); 
    *(arr+j) = temp; 
} 
當我試圖運行我得到了以下錯誤

: 警告C4013:'互換'未定義;假設extern返回int 錯誤C2371:'swap':重新定義;不同的基本類型\

當我改變函數爲int類型,它確實工作, 任何想法爲什麼?

謝謝大家!

編輯:我很抱歉,只有在我把這個函數轉換爲一個int並且我不需要一個原型,因爲它在主函數之前我纔會出現'return 0'。

這裏是整個代碼:

//BubbleSort 

    void bubbleSort(int arr[], int size) 
    { 
     int i,j; 
     for(i=0; i < size; i++) 
     { 
      for(j=i+1; j < size; j++) 
      { 
       if(*(arr+i) > *(arr+j)) 
       { 
        /*temp = *(arr+i); 
        *(arr + i) = *(arr + j); 
        *(arr + j) = temp;*/ 
        swap(arr,i,j); 
       } 
      } 
     } 
    } 
    void swap(int arr[], int i, int j) 
    { 
     int temp = *(arr+i); 
     *(arr + i) = *(arr+j); 
     *(arr+j) = temp; 
    } 
    void main() 
    { 
     int i, arr[] = {8,0,6,-22,9}; 
     bubbleSort(arr, sizeof(arr)/sizeof(int)); 
     for(i=0; i < sizeof(arr)/sizeof(int); i++) 
     { 
      printf("%d, ",*(arr+i)); 
     } 
     printf("\n"); 
    } 
+0

您正在返回0,而該方法具有的空隙的類型。只有當類型不是無效時才返回值。 – trumank 2012-03-30 14:19:08

+0

+1來反擊無意義的,無法解釋的downvote。 – ArjunShankar 2012-03-30 14:20:14

+0

不,如果函數在使用之前已定義,則不需要使用獨立的原型。定義還提供了一個原型。 – pmg 2012-03-30 14:30:34

回答

1

編輯囊括了所有的代碼

裏面bubbleSort()你調用一個名爲swap()功能,但是,在代碼中的這一點,沒有名爲swap()定義或聲明的函數。

解決方案1:bubbleSort()
解決方案2的定義之前移動的swap()把定義爲:「交換:定義bubbleSort()


顯然

錯誤C2371之前指定的swap()原型':重新定義;不同的基本類型

定義您的範圍時還有另一個swap函數。

也許this one

+0

如果它與C++交換相沖突,那麼代碼必須用錯誤的語言C++編譯。 – Lundin 2012-03-30 14:53:46

+0

是的......不幸的是很多人沒有正確配置MS Visual Studio來防止C++編譯。 – pmg 2012-03-30 14:57:43

2

你似乎缺乏功能的適當的原型。

第一次調用之前添加

void swap(int arr[], int size, int i, int j); 

此外,在索引中使用這種以指針爲中心的表示方法確實很少,尤其是在您將arr參數聲明爲數組後,尤其令人困惑。它是清潔,只需使用:

const int temp = arr[i]; 
arr[i] = arr[j]; 
arr[j] = temp; 

通知使用consttemp值太大,因爲它不會被分配之後改變。 3線功能不是什麼大問題,但是一個好習慣。

+0

謝謝,但我們被要求使用指針...:/ – Tal87 2012-03-30 14:24:25

0

如果該函數爲空,則不能返回一個數字。

更改

return 0; 

return; 
0

因爲你返回0取出return語句,你應該罰款,特別是因爲你的指針而不是拷貝操作值。

0

使用「void」表示該函數不返回任何值,但實際上你的函數返回「0」,這是一個int類型。所以你應該在函數定義之前使用int而不是void。原來的問題後

1

您需要將void swap(int arr[], int i, int j)放在void bubbleSort()之上,因爲您在bubbleSort()之內使用swap()

如果沒有,你會遇到C的隱式聲明,即在main(),你打電話bubbleSort()bubbleSort()會調用swap(),但在這一點上,bubbleSort()不知道你怎麼想,因爲它的swap()聲明在它下面聲明。所以,你的編譯器明白你在調用swap()這就是implicitly declared

而後來,當您的編譯器遇到您的真實聲明void swap(int arr[], int i, int j)時,它會抱怨它是重新定義。

除了將您的swap()聲明移動到最頂端之外,您還可以通過將函數聲明放在最頂端,並且定義在separately以下來解決。


除此之外,你似乎並不指向正確的方式使用,因爲你已經通過int arr[]swap()功能,在這裏你可以做直接交換由@unwind指出:

const int temp = arr[i]; 
arr[i] = arr[j]; 
arr[j] = temp; 

考慮這個swap()

void swap(int *x, int *y){ 
int temp = *x; 
*x=*y; 
*y=temp; 
} 

這對你學習,你可以真正改變是很重要的content的一個變量通過將地址傳入一個函數,如swap(int *x, int *y),這將非常方便。例如:

int x,y; 
x=1; 
y=1; 
increment_both_coordinate(x,y); 
//after this call, you want to have x = 2, y = 2 

這隻能使用類似於swap(int *x, int *y)的方法來實現。這僅僅是一個例子,你會明白當你將來看到它時它會有多大用處。

+0

非常感謝,非常有幫助 – Tal87 2012-03-30 15:22:16

0

下面是用於交換整數的函數:

void swap(int *x, int *y) { 
    *x = *x^*y; 
    *y = *x^*y; 
    *x = *x^*y; 
} 

int main(int argc, char* argv) { 

    int a,b; 

    a = 5; 
    b = 10; 
    swap(&a, &b); 
    printf("a = %d, b = %d\n", a, b); 
    return 0; 
} 

可以交換兩個陣列單元是這樣的:swap(&arr[i], &arr[j]);