1

好的,所以我会尝试清楚地解释我的问题。

我想要一个函数,它可以根据元素的大小以及元素中变量的偏移量和大小(用于结构)对任何数组进行排序。

所以我的功能看起来像:

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*));
4

1 回答 1

2

你不能只使用 memcpy 吗?这可能会以最有效的方式进行。

uint8_t* temp = malloc(elem_size);
memcpy(temp, array + i * elem_size, elem_size);
于 2013-02-14T23:05:01.207 回答