【发布时间】:2014-06-12 14:41:36
【问题描述】:
我编写了大量抽象数据类型(即:哈希表、堆等)和简单算法(即:搜索、排序、列表操作等),它们都适用于int 的数组。我已经修改了一些算法,使其类似于下面的算法,因此我可以概括代码,而无需为我想要排序/比较的每种数据类型重新编写相同的算法:
void* bubbleSort(void* inputArray, void (*functionPtr)(void*,void*)), size_t dataTypeSize, size_t numElements)
我的想法是我希望能够对任意数据类型的数组进行排序(即:自定义structs),为了适应这一点,我将输入数组转换为指向 void 的指针,并且排序算法需要一个指向特定比较函数的函数指针,因此它知道如何比较相同数据/结构类型的任何两个元素。到目前为止一切顺利。
我想不通的一件事是如何在函数中正确地转换数组,这样我就可以一次访问一个元素。我正在尝试完成类似的事情:
someRandomDataType* tempArray = (someRandomDataType*)inputArray;
但是,如果不使用宏,我找不到任何在运行时执行此操作的方法(如果可能,我希望在这种情况下避免使用宏)。在我的情况下,我真正需要做的就是强制转换inputArray,以便将其视为具有任意大小元素的数组。是否有某种方法可以强制转换指向数组的指针,以便动态地等同于:
(typeThatIsDataTypeSize*) tempArray = (typeThatIsDataTypeSize*)inputArray;
其中“dataTypeSize”指的是传递给排序函数的size_t 输入值?谢谢!
【问题讨论】:
-
您实际上不需要强制转换为基础类型。只需在 char 指针中工作并根据需要手动缩放指针。你可以找到 qsort 的源代码,看看它是如何完成的。
-
void (*functionPtr)(void*,void*)): 必须返回结果比较函数。
标签: c arrays algorithm sorting generic-programming