【问题标题】:Generics and casting by size rather than by type泛型和按大小而不是按类型转换
【发布时间】: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


【解决方案1】:

您的气泡函数已经包含所有信息。 size,等于你包含的元素的 sizeof 并计算元素的数量。

inputArray 指向第一个元素。当您想移动到下一个元素时,只需将指针增加元素的大小即可。

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

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

这就是您索引数组的方式。

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

【讨论】:

  • 谢谢。现在看起来很简单,摆在我面前。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多