Как решить ошибку множественного определения свопа в C - PullRequest
0 голосов
/ 17 июня 2020

Я получаю сообщение об ошибке «множественное определение подкачки» от функции подкачки. Этот код предназначен для сортировки по выбору.

#include <stdio.h>
#include <string.h>

static void BiDirectionalSelectionSort(int arr[], int n)
{
    for (int i = 0, j = n - 1;  i < j; i++, j--)
    {
        int min = arr[i], max = arr[i];
        int min_i = i, max_i = i;
        for (int k = i; k <= j; k++)
        {
            if (arr[k] > max)
            {
                max = arr[k];
                max_i = k;
            }

            else if (arr[k] < min)
            {
                min = arr[k];
                min_i = k;
            }
        }


        swap(arr, i, min_i);

        if (arr[min_i] == max)
            swap(arr, j, min_i);
        else
            swap(arr, j, max_i);
    }
}

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

static void Main()
{
    int arr[] = { 20, 15, 8, 10, 5, 7, 6, 2, 9, 1 };
    int n = arr;
    BiDirectionalSelectionSort(arr, n);
    printf("Array:\n");
    for (int i = 0; i < n; i++)
        printf(arr[i] + " ");
    printf("/n");
}

Ответы [ 3 ]

2 голосов
/ 17 июня 2020

Вам необходимо включить подпись метода int swap(int arr[], int *i, int *j); перед использованием (т.е. перед двунаправленным ...). Как бы то ни было, C создает «неявное объявление», которое не соответствует тому, что вы написали. Если вы используете g cc, вы можете добавить -Wall или -Wimplicit или -Wimplicit-function-декларацию в командную строку, чтобы она сообщала вам, что происходит именно это.

2 голосов
/ 17 июня 2020

Вам необходимо объявить прототип функции вперед-назад, чтобы при вызове функции компилятор знал о типе возвращаемого значения функции и ожидаемых аргументах.

Добавить

int swap (int [], int *, int *);

после операторов include.

0 голосов
/ 17 июня 2020

Компилятор читает файл сверху вниз. Если он видит swap по swap(arr, i, min_i); внутри BiDirectionalSelectionSort, он не знает, что это такое.

Вам необходимо:

  1. Использовать предварительное объявление для функцию swap и поместите ее перед определением BiDirectionalSelectionSort
#include <stdio.h>
#include <string.h>

void swap (int** arr, int i, int j);           // <------------ HERE

static void BiDirectionalSelectionSort (int arr[], int n)
{
    for (int i = 0, j = n - 1;  i < j; i++, j--)
    {
        int min = arr[i], max = arr[i];
        int min_i = i, max_i = i;
        for (int k = i; k <= j; k++)
        {
            if (arr[k] > max)
            {
                max = arr[k];
                max_i = k;
            }

            else if (arr[k] < min)
            {
                min = arr[k];
                min_i = k;
            }
        }


        swap(&arr, i, min_i);

        if (arr[min_i] == max)
            swap(&arr, j, min_i);
        else
            swap(&arr, j, max_i);
    }
}

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

int main (void)
{
    int arr[] = { 20, 15, 8, 10, 5, 7, 6, 2, 9, 1 };
    size_t n = sizeof (arr) / sizeof (*arr);
    BiDirectionalSelectionSort(arr, n);
    printf("Array:\n");
    for (size_t i = 0; i < n; i++)
    {
       printf("arr[%d] = %d\n", i, arr[i]);      
    }        
}

или

Поместите определение swap перед определением функции BiDirectionalSelectionSort.
#include <stdio.h>
#include <string.h>

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

static void BiDirectionalSelectionSort(int arr[], int n)
{
    for (int i = 0, j = n - 1;  i < j; i++, j--)
    {
        int min = arr[i], max = arr[i];
        int min_i = i, max_i = i;
        for (int k = i; k <= j; k++)
        {
            if (arr[k] > max)
            {
                max = arr[k];
                max_i = k;
            }

            else if (arr[k] < min)
            {
                min = arr[k];
                min_i = k;
            }
        }


        swap(&arr, i, min_i);

        if (arr[min_i] == max)
            swap(&arr, j, min_i);
        else
            swap(&arr, j, max_i);
    }
}

int main (void)
{
    int arr[] = { 20, 15, 8, 10, 5, 7, 6, 2, 9, 1 };
    size_t n = sizeof (arr) / sizeof (*arr);
    BiDirectionalSelectionSort(arr, n);
    printf("Array:\n");
    for (size_t i = 0; i < n; i++)
    {
       printf("arr[%d] = %d\n", i, arr[i]);      
    }        
}

Примечание сбоку:

static void Main() - Эта голова для main() устарел четырьмя разными способами. Слева направо:

  1. main() нельзя квалифицировать с помощью static. По крайней мере, не "основной" main(). Вы можете иметь функцию main() в другом исходном файле и объявить ее static, но это другой случай.
  2. Возвращаемое значение main() должно быть целочисленного типа, обычно int, не void.
  3. Компоновщик чувствителен к регистру. Main - это другой идентификатор, чем main.
  4. Чтобы полностью соответствовать стандарту, список параметров main не должен быть пустым, используйте вместо него (void).
...