Предупреждения при сортировке массива структуры с пузырьковой сортировкой - PullRequest
0 голосов
/ 30 марта 2020

Я создал 2 структуры, одна из которых называется продуктом, а другая - заказом.

Я хотел отсортировать массив, состоящий из заказов, и эти заказы включали массив продуктов, и я использовал алгоритм пузырьковой сортировки, чтобы сделать это. .

Программа работает хорошо, но проблема в том, что она выдает странные предупреждения, которые я не могу понять.

Структуры:

product:

/* Structures */
typedef struct product 
{
   int ident;
   char desc[MAX_CHARS]; /* string that describes a product eg. "bread" */
   int price;  /* price of the product*/
   int weight; /* weight of the product eg. 2kg */
   int quant; /* quantity of the product in stock */
   int state_prod;
}product;

заказ:


typedef struct order 
{
   int ident_o;
   product set_prod[MAX_PRODS_OD]; /* Set of products */
   int state;
}order;

алгоритм пузырьковой сортировки:

void swap(char * xp,char * yp) 
{ 
    char * temp = xp; 
    xp = yp; 
    yp = temp; 
} 

/* A function to implement bubble sort */
void bubbleSort(product arr[], int n) 
{ 
   int i, j; 
   for (i = 0; i < n-1; i++)       

       /* Last i elements are already in place */ 
       for (j = 0; j < n-i-1; j++)  
           if (arr[j].desc > arr[j+1].desc) 
              swap(&arr[j].desc, &arr[j+1].desc); 
} 

Я могу скомпилировать только с помощью этой команды "g cc -g -Wall -Wextra -Werror -ansi -pedanti c ".

Предупреждения:

In function ‘bubbleSort’:
error: passing argument 1 of ‘swap’ from incompatible pointer type [-Werror=incompatible-pointer-types]
               swap(&arr[j].desc, &arr[j+1].desc);
                    ^
note: expected ‘char *’ but argument is of type ‘char (*)[64]’
 void swap(char * xp,char * yp)
      ^~~~

error: passing argument 2 of ‘swap’ from incompatible pointer type [-Werror=incompatible-pointer-types]
               swap(&arr[j].desc, &arr[j+1].desc);
                                  ^
note: expected ‘char *’ but argument is of type ‘char (*)[64]’
 void swap(char * xp,char * yp)
      ^~~~

1 Ответ

0 голосов
/ 30 марта 2020

Это сообщение об ошибке

error: passing argument 1 of ‘swap’ from incompatible pointer type [-Werror=incompatible-pointer-types]
               swap(&arr[j].desc, &arr[j+1].desc);

означает, что вы передали функции указатель на массив, объявленный как

char desc[MAX_CHARS];

, используя, например, выражение &arr[j].desc, которое имеет тип char( * )[MAX_CHARS]. Но параметр функции имеет тип char *. Вы должны хотя бы написать

swap( arr[j].desc, arr[j+1].desc);

Однако сам поменять функцию неверно. Он не меняет местами элементы массивов символов.

void swap(char * xp,char * yp) 
{ 
    char * temp = xp; 
    xp = yp; 
    yp = temp; 
} 

Вы можете определить его, например, следующим образом

void swap( char *xp, char *yp ) 
{ 
    char temp[MAX_CHARS];
    strcpy( temp, xp );
    strcpy( xp, yp );
    strcpy( yp, temp ); 
} 

Вот демонстрационная программа

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

#define MAX_CHARS   10

typedef struct product 
{
   char desc[MAX_CHARS]; /* string that describes a product eg. "bread" */
} product;

void swap( char *s1, char *s2 )
{
    char temp[MAX_CHARS];
    strcpy( temp, s1 );
    strcpy( s1, s2 );
    strcpy( s2, temp );
}

int main(void) 
{
    product p1 = { "Hello" };
    product p2 = { "World" };

    printf( "p1.desc = %s\n", p1.desc );
    printf( "p2.desc = %s\n", p2.desc );

    putchar( '\n' );

    swap( p1.desc, p2.desc );

    printf( "p1.desc = %s\n", p1.desc );
    printf( "p2.desc = %s\n", p2.desc );

    return 0;
}

Его результат равен

p1.desc = Hello
p2.desc = World

p1.desc = World
p2.desc = Hello

И в операторе if

if (arr[j].desc > arr[j+1].desc) 

вы должны сравнить сами строки как

if ( strcmp( arr[j].desc, arr[j+1].desc ) > 0 )

Также обратите внимание, что вы не обмениваясь структурами. Вы только меняете местами их элементы данных. Это не то же самое, что сортировать структуры.

Для обмена объектами типа структуры функция swap может выглядеть следующим образом

void swap( product *p1, product *p2 )
{
    product temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

Вот демонстрационная программа.

#include <stdio.h>

#define MAX_CHARS   10

typedef struct product 
{
   char desc[MAX_CHARS]; /* string that describes a product eg. "bread" */
} product;

void swap( product *p1, product *p2 )
{
    product temp = *p1;
    *p1 = *p2;
    *p2 = temp; 
}

int main(void) 
{
    product p1 = { "Hello" };
    product p2 = { "World" };

    printf( "p1.desc = %s\n", p1.desc );
    printf( "p2.desc = %s\n", p2.desc );

    putchar( '\n' );

    swap( &p1, &p2 );

    printf( "p1.desc = %s\n", p1.desc );
    printf( "p2.desc = %s\n", p2.desc );

    return 0;
}

Ее вывод

p1.desc = Hello
p2.desc = World

p1.desc = World
p2.desc = Hello
...