【发布时间】:2018-06-13 09:44:25
【问题描述】:
我刚刚遇到了动态类型变量的问题(不是真正动态的,但应该在运行时确定),情况是这样的:
我有一个接受双精度数组的函数,将其转换为整数并写入文件,整数可以有不同的位长,如 8、16 和 32。因为它是一个数组,我想使用指向访问最终结果(数组)。所以我现在使用带有 malloc 和 switch case 的 void 指针,但是当我尝试访问或修改这个数组时,需要在每个地方添加 switch case,我的问题是,有没有更好的方法来做到这一点?
当前代码如下:
void foo(double * arr, int len, int iBits, FILE *fh)
{
void * newArr;
int iBytePerElement, iBase,i;
iBytePerElement = iBits / 8;
iBase = (1 << (iBits - 1)) - 1;
switch (iBytePerElement)
{
case 1:
{
newArr = (int8_t *) malloc(sizeof(int8_t)*len);
break;
}
case 2:
{
newArr = (int16_t *) malloc(sizeof(int16_t)*len);
break;
}
case 4:
{
newArr = (int32_t *) malloc(sizeof(int32_t)*len);
break;
}
}
for (i = 0; i < len; ++i)
{
switch (iBitPerElement)
{
case 1:
{
((int8_t *)newArr)[i] = (int8_t)(arr[i]*iBase);
break;
}
case 2:
{
((int16_t *)newArr)[i] = (int16_t)(arr[i]*iBase);
break;
}
case 4:
{
((int32_t *)newArr)[i] = (int32_t)(arr[i]*iBase);
break;
}
}
}
fwrite(newArr, iBytePerElement, iBytePerElement*len,fh);
}
【问题讨论】:
-
函数。制作一组函数来处理您的特殊“通用”数组。然后使用数组的代码只需要使用你的函数,而不必关心它是如何实现的细节。然后,您可以很容易地使其更加通用,以存储任何类型的同类数据(包括结构)。
-
在不相关的注释中,请记住
malloc返回void *,因此不需要演员表(你不应该真的 cast the result ofmallocanyway)。 -
除编外。哥们:可能是,
qsort()可以提供一些启发。它以类似 C 的通用方式实现数组的排序 - 听起来有点类似于您打算做的事情。 -
如何从这个函数返回
newArr?还不清楚为什么在铸造之前需要将浮点数乘以任何东西(iBase?)?这个函数的具体输入输出是什么? -
让一个函数做三件不同的事情看起来好像有三个较小的函数试图退出。考虑使用
foo8(x,y)而不是foo(x,y,8)。
标签: c void-pointers