【发布时间】:2013-02-14 23:00:39
【问题描述】:
好的,我会尽量清楚地解释我的问题。
我想要一个函数,它可以根据元素的大小、偏移量和元素中变量的大小(用于结构)对任何数组进行排序。
所以我的函数看起来像:
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,但如果元素是结构,则可能更多)
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*));
【问题讨论】:
-
您将如何比较从该位置提取的数据?
-
您将比较
operand_size给出的任意大小的值,对吧?无论如何,这些值的类型是什么?字符串?任意大小的整数?小/大端? -
是的,操作数是 int,但将来可能是 char 或 long..
-
你说“*array 是指向数组开头的指针”;你不是说
array是指向数组开头的指针吗? -
是的,这就是我的意思:)