我正在努力用 C 语言创建一个通用(或非类型化)数组(我知道 C++ 使这更容易)。简而言之,我想分配一个数组来保存特定已知类型的数组(在运行时)。在实际实现中,它取决于用户输入。
我一直在尝试使用枚举/结构场景,遵循在几个谷歌命中中找到的建议,但我担心我对 void 指针缺乏经验并且缺乏具体示例阻止我获得一段有效的代码. (通常我只会买一本书,但我在一个我不会说该语言的国家,而且英语编程书籍不存在。)
问题归结为以下简化:我有一个图像(只有一维),像素值可能是 int、float 或 double。我确实有一个函数可以告诉我类型。我想要做的就是将像素存储在适当类型的数组中。 (实际上这些图像非常大,我的动机是节省内存并避免为每种类型编写代码块。)
我一直在尝试类似下面的方法,但它可能不是最好的(可能的数据结构的代码片段):
enum type {
typeint, typefloat, typedouble
};
struct genericarray {
enum type type;
void *storage;
};
我想以某种方式将这些像素存储在 generciarray 的实例中。到目前为止,我所有的尝试都变成了“警告:取消引用‘void *’指针”派对,我承认我不理解。
我永远感激任何帮助,特别是一些简化的例子,如何获得一个有效的通用数组。该示例可以只使用 for 循环来初始化。我可以弄清楚如何加载我的实际图像。
最佳答案
我会将整个事情封装如下:
#include "stdlib.h"
#include "stdio.h"
// structure
enum type { typeint, typefloat, typedouble };
struct genericarray
{
enum type type;
void ** storage;
};
typedef struct genericarray genericarray;
// allocate
void allocate(long numItems, enum type varType, genericarray * array)
{
(*array).type = varType;
switch (varType)
{
case typeint:
(*array).storage = malloc(numItems*sizeof(int));
break;
case typefloat:
(*array).storage = malloc(numItems*sizeof(float));
break;
case typedouble:
(*array).storage = malloc(numItems*sizeof(double));
}
}
// release
void release(genericarray array)
{
free(array.storage);
}
// usage
int main(int argCount, char ** argList)
{
genericarray image_1;
genericarray image_2;
int iv;
float fv;
allocate(10, typeint, &image_1);
allocate(10, typefloat, &image_2);
((int *)(image_1.storage))[5] = 42;
iv = ((int *)(image_1.storage))[5];
printf("image_1[5] = %d\n", iv);
((float *)(image_2.storage))[5] = 3.14159;
fv = ((float *)(image_2.storage))[5];
printf("image_2[5] = %f\n", fv);
release(image_2);
release(image_1);
return 0;
}
关于c - 请求一个简单的 C 代码示例,展示如何使用通用或无类型(通过 void *)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/631632/