【问题标题】:Void array, dynamic size variables in Cvoid数组,C中的动态大小变量
【发布时间】: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 是指向数组开头的指针吗?
  • 是的,这就是我的意思:)

标签: c pointers void


【解决方案1】:

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

uint8_t* temp = malloc(elem_size);
memcpy(temp, array + i * elem_size, elem_size);

【讨论】:

  • 谢谢!这正是我想要的。太明显了所以我没有考虑^^
  • void * 上进行指针运算是不可移植的。事实上,它只适用于少数编译器。如果您完全关心可移植性,请在进行算术运算之前转换为 char *
猜你喜欢
  • 2012-04-17
  • 2015-06-06
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
相关资源
最近更新 更多