我有一个返回数组Data
的函数。数组的类型为int
或float
。我想使用void
指针。如果outputType
为0,则Data
将指向整数数组的指针,否则将指向浮点数组。
是否可以在C语言中执行此操作?
void getData(void *Data , uint8_t outputType)
{
...
int16_t acc[3]={0,0,0};
...
acc[0] = (int16_t) ((data[1]*256+data[0]));
acc[1] = (int16_t) ((data[3]*256+data[2]));
acc[2] = (int16_t) ((data[5]*256+data[4]));
Data = acc;
}
在主代码中:
int16_t output[3];
getData(output, 0);
答案 0 :(得分:7)
您可以执行以下操作:
void getData(void *Data , uint8_t outputType) {
if (outputType == 0) {
int16_t* data = Data;
/* fill int16_t data here - eg. : */
data[0] = 42;
}
else {
float* data = Data;
/* fill float data here - eg. : */
data[0] = 42.0f;
}
}
所有假设您将其称为:
int16_t output[3];
getData(output, 0);
或:
float output[3];
getData(output, 1);
请特别注意不要超出数组的范围。
说明
任何指向对象类型的指针都可以转换为void*
并再次返回原始类型,结果指针将与原始指针进行比较。
这可以(在这种情况下)用于实现可在任何指针类型上工作的通用函数(例如,What does void* mean and how to use it?)。
尽管有一个警告:void*
不能被取消引用(也不能对其执行指针算法),因此必须在取消引用之前将其转换回原始指针类型。 outputType
参数准确说明了原始指针的类型,因此该函数可以执行正确的转换。
之后,该函数可以对转换后的指针进行操作,就好像它是原始指针一样。如果原始指针指向一个数组,那么转换后的指针也可以用于访问该数组的所有项。
答案 1 :(得分:2)
完全有可能做您想做的事情,但不是完全按照您尝试做的方式做。如果您想在执行操作时预先分配缓冲区,那很好,您只需要传递指针本身即可。然后您的问题开始了。
首先,三个int16_t
不足以容纳相同数量的float
元素(通常每个元素4个字节)。您需要确保传入的缓冲区足够大以容纳输出。
第二,赋值Data = acc;
仅复制指针的值,而不是其包含的数据。为此,您必须使用memcpy(Data, acc, 3 * sizeof(uint16_t));
,memmove(Data, acc, 3 * sizeof(uint16_t));
或类似的方法。更简单地说,您可以将值直接存储在Data
缓冲区中,而不必首先弄乱acc
。