указатели — Сравнение пустот в переполнении стека

Попытка сравнить пустоты для алгоритма сортировки. У меня пока есть это, но это своего рода побеждает цель ИМО, если вы разыгрываете их в броню. Есть ли способ сравнить пустоты? Моему профессору не хватило времени и как застряли в сети. Любая помощь приветствуется. Спасибо

int fcmp(const void *one, const void *two)
{
if (*(int*)one > *(int*)two) return 1;
if (*(int*)one < *(int*)two) return -1;
return 0;
}

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);
}
1

Другие решения

Предполагая, что идея заключается в использовании fcmp в контексте qsort, ваш код совершенно действителен

поскольку qsort не заботится о возвращаемом значении 1 или же -1 и будет принимать любое положительное или отрицательное число, эта версия еще короче, но будет работать с qsort точно также:

int fcmp (const void * one, const void * two)
{
return ( *(int*)one - *(int*)two );
}

Причина qsort использования void* позволяет использовать один и тот же алгоритм с разными типами данных.

2

Вы не сравниваете «пустоты» в этом коде. Код кастинг void указатели в int указатели, а затем разыменовывать результат, что означает, что вы сравниваете ints, на которые указывают указатели. В идеале, функция была бы написана так:

int fcmp(const int *one, const int *two)
{
if (*one > *two) return 1;
if (*one < *two) return -1;
return 0;
}

Но так не написано fcmp() в этом случае необходимо иметь конкретную подпись. В противном случае он не может быть использован в общем виде. Например, для обратного вызова другой функции.

2
По вопросам рекламы [email protected]