gpt4 book ai didi

c - 泛型和按大小而不是按类型进行转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:17:58 25 4
gpt4 key购买 nike

我已经编写了大量抽象数据类型(即:哈希表、堆等)和简单算法(即:搜索、排序、列表操作等),它们都适用于 int 数组。我修改了我的一些算法,使其与下面的算法类似,这样我就可以概括代码,而无需为我想要排序/比较的每种数据类型重新编写相同的算法:

void* bubbleSort(void* inputArray, void (*functionPtr)(void*,void*)), size_t dataTypeSize, size_t numElements)

我的想法是,我希望能够对任意数据类型的数组进行排序(即:自定义 struct),为了适应这一点,我将输入数组转换为指针 - to-void,并且排序算法需要一个指向特定比较函数的函数指针,因此它知道如何比较相同数据/结构类型的任意两个元素。到目前为止一切顺利。

我想不通的一件事是如何在函数内正确转换数组,以便我一次可以访问一个元素。我正在尝试完成类似的事情:

someRandomDataType* tempArray = (someRandomDataType*)inputArray;

但是,如果不使用宏,我找不到在运行时执行此操作的任何方法(在这种情况下我想尽可能避免使用宏)。在我的情况下,我真正需要做的就是强制转换 inputArray 以便它被视为具有任意大小元素的数组。有什么方法可以转换一个指向数组的指针,以便动态地等同于:

(typeThatIsDataTypeSize*) tempArray = (typeThatIsDataTypeSize*)inputArray;

其中“dataTypeSize”是指传递给排序函数的 size_t 输入值?谢谢!

最佳答案

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

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

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

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

这就是索引数组的方式。

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

关于c - 泛型和按大小而不是按类型进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24187271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com