Tal
Tal

Reputation: 700

Swapping function c

I have to write a swap function for my bubble sort
That's what I've got:

void swap(int arr[], int size, int i, int j)
{
    int temp = *(arr+i);
    *(arr + i) = *(arr+j);
    *(arr+j) = temp;
}

When I'm trying to run I get the following errors:

warning C4013: 'swap' undefined; assuming extern returning int error C2371: 'swap' : redefinition; different basic types

When I do change the function to the type of int, it does work, any idea why?

I don't need a prototype because it's before the main function... do I?

Here's the whole code:

//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");
    }

Upvotes: 1

Views: 4134

Answers (7)

pmg
pmg

Reputation: 108988

Inside bubbleSort() you call a function named swap() but, at that point in the code, there is no function named swap() either defined or declared.

Solution 1: move the defintion of swap() to before the definition of bubbleSort()
Solution 2: specify the prototype of swap() before defining bubbleSort()

Upvotes: 1

I&#39;m a frog dragon
I&#39;m a frog dragon

Reputation: 8865

You need place void swap(int arr[], int i, int j) on top of void bubbleSort() because you're using swap() inside bubbleSort().

If not you will run into the implicit declaration of C, that is, in main(), you're calling bubbleSort(), and bubbleSort() will call swap(), but at this point, bubbleSort() does not know about you declaration of swap() since it is declared below it. So, what your compiler understand is that you're calling a swap() which is implicitly declared.

And later, when your compiler comes across your real declaration of void swap(int arr[], int i, int j), it will complain that it is a redefinition.

Other than moving your swap() declaration on to the top most, you can also solve by making the function declaration at the top most, and the definition below separately.


Besides, you don't seem to use pointer the right way, because you already passed int arr[] into the swap() function, where you can do direct swapping as pointed out by @unwind:

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

Consider this swap():

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

This is important for you to learn that you can actually change the content of a variable by passing the address into a function, like swap(int *x, int *y), it will be very convenient. Example:

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

This can only be achieve using the method similar to swap(int *x, int *y). This is just an illustration, you will understand how useful this can be when you see them in future.

Upvotes: 2

mrk
mrk

Reputation: 3191

Here is a function for swapping integers:

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;
}

You can swap two array cells this way: swap(&arr[i], &arr[j]);

Upvotes: 0

Eric
Eric

Reputation: 68

Using "void" means the function doesn't return any value,but actually your function return "0",which is an int type.So you should use int instead of void before function definition.

Upvotes: 0

FloppyDisk
FloppyDisk

Reputation: 1703

Because you're returning 0. Take out the return statement and you should be fine, especially since you're operating on pointers instead of copy values.

Upvotes: 0

Foggzie
Foggzie

Reputation: 9821

If the function is void, you can't return a number.

Change your

return 0;

to

return;

Upvotes: 0

unwind
unwind

Reputation: 400019

You seem to lack a proper prototype for the function.

Add

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

before the first call.

Also, there's really little point in using such pointer-centric notation for the indexing, especially confusing since you declared the arr argument as an array. It's cleaner to just use:

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

Notice use of const for the temp value too, since it's not going to change after being assigned. Not a big deal in a 3-line function, but a good habit.

Upvotes: 2

Related Questions