泛型和按尺寸而不是按类型铸造

时间:2014-06-12 14:41:36

标签: c arrays algorithm sorting generic-programming

我已经编写了大量的抽象数据类型(例如:哈希表,堆等)和简单的算法(即:搜索,排序,列表操作等),这些算法都在{{1}的数组上工作}。我已经修改了一些算法,就像我下面的算法一样,所以我可以对代码进行概括,而无需为我想要排序/比较的每种数据类型重写相同的算法:

int

我的想法是,我希望能够对任意数据类型的数组进行排序(即:custom void* bubbleSort(void* inputArray, void (*functionPtr)(void*,void*)), size_t dataTypeSize, size_t numElements) s),为了适应这种情况,我将输入数组转换为指向void的指针,排序算法需要一个指向特定比较函数的函数指针,因此它知道如何比较相同数据/结构类型的任何两个元素。到目前为止一切都很好。

我无法弄清楚的一件事是如何在函数中正确地转换数组,这样我就可以一次访问一个元素。我正在努力完成类似的事情:

struct

但是,我没有找到任何在不使用宏的情况下在运行时执行此操作的方法(如果可能,我希望在这种情况下避免使用宏)。在我的情况下,我真正需要做的就是转换someRandomDataType* tempArray = (someRandomDataType*)inputArray; ,以便它被视为具有任意大小元素的数组。有没有办法将指针转换为数组,以便动态地等同于:

inputArray

“dataTypeSize”是指传递给排序函数的(typeThatIsDataTypeSize*) tempArray = (typeThatIsDataTypeSize*)inputArray; 输入值?谢谢!

1 个答案:

答案 0 :(得分:2)

您的气泡功能已经拥有所有信息。 size,它等于您包含的sizeof元素并计算元素数。

inputArray指向第一个元素。如果要移动到下一个元素,只需按指示元素的大小增加指针即可。

void* second_element = ( char* )inputArray + size ;

size_t n = 123 ;
void* nth_element = ( char* )inputArray + size * n ;

这是您对数组编制索引的方法。

移动元素由memcpy完成,最后一个参数为size。交换是通过声明大小为size的临时内存并使用memcpy来移动内存来完成的。