好吧,我会试着清楚地解释我的问题。
我希望有一个函数可以根据元素的大小以及元素中的变量和变量的大小(用于结构)来排序任何数组。
所以我的功能看起来像是:
void sort(void* array, size_t elem_size, int elem_count, size_t operand_offset, size_t operand_size)
数组是指向数组开头的指针
elem_size是数组中一个元素的大小
elem_count是数组中元素的数量
operand_offset是元素中基于排序的变量的偏移量(如果元素只是一个变量,它将为0,但如果元素是结构,它可能更多)
operand_size是该变量的大小
在这个函数中我需要创建一个临时变量,我会这样做:
void* temp = malloc(elem_size);
*temp = *(array+ i*elem_size);
但编译器不同意:取消引用void *指针,他不知道我的临时变量的大小......
我知道我可以每字节执行一次,但我想知道是否有更好的方法。
所以我的问题是: 如何设置指向elem_size的指针的“大小”?
有条件的问题: 如果大小已知,我可以输入array [i]来访问元素吗?
修改 好的,我的问题解决了,我必须使用memcpy
但是现在我还有另外一个我没想到的问题。
考虑到元素中操作数的大小和偏移量,我如何提取并比较它?
有点像:
void *a = malloc(operand_size);
void *b = malloc(operand_size);
memcpy(a, array+i*elem_size + operand_offset, operand_size);
memcpy(b, array+j*elem_size + operand_offset, operand_size);
if (a < b)
...
else
...
我该怎么做?
* 编辑2:* 好吧,最后管理每个操作数大小的if语句太复杂了,所以我做了一些完全不同的事情
所以基本上我有一个包含n个元素的void *array
,我正在编写一个函数来对它进行排序。
但是不是直接给出元素中的偏移量和操作数的大小,而是给了函数另一个函数来比较两个元素。这很好用
int compareChar(void* a, void* b);
int compareShort(void* a, void* b);
int compareInt(void* a, void* b);
int compareLong(void* a, void* b);
int compareFOO(void* a, void* b);
void sort(void* array, size_t elem_size, int elem_count, int (*compare)(void*,void*));
答案 0 :(得分:2)
难道你不能只使用memcpy吗?这可能会以最有效的方式实现。
uint8_t* temp = malloc(elem_size);
memcpy(temp, array + i * elem_size, elem_size);