#c #casting
Вопрос:
У меня здесь есть эта строка кода, в которой я пытаюсь ввести два аргумента void в виде строк, а затем использовать функцию strcmp для сравнения этих двух:
int compareFirstName(const void * p1, const void * p2)
{
const char **str1, **str2;
str1 = (char **) amp;p1;
str2 = (char **) amp;p2;
return strcmp(*str1, *str2);
}
Тем не менее, я продолжаю получать ошибку,
assignment from incompatible pointer type [-Werror]
str1 = (char **) amp;p1;
^
Я почти уверен, что правильно подбираю, поэтому не знаю, в чем проблема. Раньше у меня была ошибка сегментации, но я ее исправил и теперь застрял здесь.
РЕДАКТИРОВАТЬ: Это структура, которую я использую для сравнения имен, идентификаторов и фамилий. Оказывается, мне нужно преобразовать пустоту * в Студента*, что меня немного смущает
typedef struct
{
int ID;
char firstname[NAME_LENGTH] ;
char lastname[NAME_LENGTH] ;
} Student;
Комментарии:
1. Пожалуйста, уточните, для чего вы используете эту функцию сравнения. Мне кажется, что вы хотите использовать его для
qsort
чего-то подобного.2. Да, он будет использоваться для qsort вместе со структурой
3. Тогда вам все равно не нужны двойные указатели. Просто переместите свое
p1
иp2
в дваStudent*
указателя (s1
иs2
), а затемreturn strcmp(s1->firstname, s2->firstname);
. Но это действительно ответ, данный 0___________ (с незначительными изменениями после вашего редактирования).4. Какова цель этой функции? Сравните конкретные элементы двух заданных объектов или все элементы? Каков был бы вариант использования?
Ответ №1:
ПОСЛЕ ВОПРОСА ПРАВКА:
int compareFirstName(const void * p1, const void * p2)
{
const Student *str1, *str2;
str1 = p1;
str2 = p2;
return strcmp(str1 -> firstname, str2 -> lastname);
}
/* the real cars is used here */
int compareFirstName1(const void * p1, const void * p2)
{
return strcmp(((const Student *)p1) -> firstname, ((const Student *)p2) -> lastname);
}
ПЕРЕД РЕДАКТИРОВАНИЕМ
Вы не пытаетесь привести в качестве «строк» только указатель на указатель на символ, который не имеет ничего общего со строками C.
Вы также не хотите получать ссылку на локальные параметры p1
и p2
Ты хочешь:
int compareFirstName(const void * p1, const void * p2)
{
const char *str1, *str2;
str1 = p1;
str2 = p2;
return strcmp(str1, str2);
}
или просто достаточно
int compareFirstName(const void * p1, const void * p2)
{
return strcmp(p1, p2);
}
Ответ №2:
Учитывая, что вопрос немного отличается от того, что было раньше, я решил опубликовать новый ответ:
int compareFirstName(const void * p1, const void * p2)
{
const Student *s1, *s2;
s1 = p1;
s1 = p2;
return strcmp(s1->firstname, s2->firstname);
}
Это способ приведения аргументов к структурам, которые вы определили как . void *
Student
Затем, поскольку p1 и p2 являются указателями на структуры, вам необходимо использовать ->
их для доступа к членам.
Комментарии:
1. @Cheatah здесь нет актерского состава