Попытка сравнить пустоты для алгоритма сортировки. У меня пока есть это, но это своего рода побеждает цель ИМО, если вы разыгрываете их в броню. Есть ли способ сравнить пустоты? Моему профессору не хватило времени и как застряли в сети. Любая помощь приветствуется. Спасибо
int fcmp(const void *one, const void *two)
{
if (*(int*)one > *(int*)two) return 1;
if (*(int*)one < *(int*)two) return -1;
return 0;
}
Похоже, это стандартная функция сравнения, используемая в нескольких стандартных библиотечных функциях, таких как qsort (), в которой вы вызываете функцию с каким-либо массивом элементов данных вместе с функцией сравнения, которая указывает, равны ли два элемента каждому или нет, и если нет, каков их порядок сортировки.
Итак, на что указывает указатель void, зависит от программиста. Это цель использования указателей void в интерфейсе функции сравнения, потому что функция, такая как qsort (), которая вызывает функцию сравнения, просто хочет знать, в каком порядке должны находиться два элемента массива. Она не знает, что Элементы массива или как сделать сравнение, он просто знает начальный адрес массива и размер каждого элемента и сколько там элементов.
Еще одна функция из стандартной библиотеки функция bsearch ().
Таким образом, чтобы использовать это, у вас может быть такой код:
увидеть Справочная страница qsort ().
typedef struct {
int iValue;
char sName[10];
} DataValue;
// compare two elements of the array and indicate which one is higher
// or lower in collating sequence or if they are equal.
int dataComp (void *one, void *two)
{
return ((DataValue *)one)->iValue - ((DataValue *)two)->iValue;
}
int main (int argc, char *argv[])
{
DataValue myData[25];
//.. put some data stuff in the array.
// call qsort with the array. specify number of elements and size of each one
qsort (myData, sizeof(myData)/sizeof(myData[0]), sizeof(myData[0]), dataComp);
}
Предполагая, что идея заключается в использовании fcmp
в контексте qsort
, ваш код совершенно действителен
поскольку qsort
не заботится о возвращаемом значении 1
или же -1
и будет принимать любое положительное или отрицательное число, эта версия еще короче, но будет работать с qsort
точно также:
int fcmp (const void * one, const void * two)
{
return ( *(int*)one - *(int*)two );
}
Причина qsort
использования void*
позволяет использовать один и тот же алгоритм с разными типами данных.
Вы не сравниваете «пустоты» в этом коде. Код кастинг void
указатели в int
указатели, а затем разыменовывать результат, что означает, что вы сравниваете int
s, на которые указывают указатели. В идеале, функция была бы написана так:
int fcmp(const int *one, const int *two)
{
if (*one > *two) return 1;
if (*one < *two) return -1;
return 0;
}
Но так не написано fcmp()
в этом случае необходимо иметь конкретную подпись. В противном случае он не может быть использован в общем виде. Например, для обратного вызова другой функции.