好的,所以我会尝试清楚地解释我的问题。
我想要一个函数,它可以根据元素的大小以及元素中变量的偏移量和大小(用于结构)对任何数组进行排序。
所以我的功能看起来像:
void sort(void* array, size_t elem_size, int elem_count, size_t operand_offset, size_t operand_size)
array 是指向数组开头的指针
elem_size 是数组中一个元素的大小
elem_count 是数组中元素的计数
operand_offset 是元素内作为排序基础的变量的偏移量(如果元素只有一个变量,则为 0,但如果元素是结构,则可能更多)
操作数大小是该变量的大小
在这个函数中,我需要创建一个临时变量,我会这样做:
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 语句太复杂了,所以我做了一些完全不同的事情
所以基本上我有一个void *array
包含 n 个元素的元素,我正在编写一个函数来对其进行排序。
但是我没有直接给出元素内操作数的偏移量和大小,而是给了函数另一个函数来比较两个元素。效果很好
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*));