Это сообщение об ошибке
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