我基于结构体在 C 中构建了一个动态分配的数组
typedef struct Array
{
int capacity;
int original_capacity;
int count;
char **elements;
// element* elements; // TODO - make this work in place of the above
} Array;
使用一系列不同的方法(如下)。它是设计一个字符串数组(char**s)。一切都完美无缺,而且一切正常。
我听说可以通过使用联合将它变成一个包含多种类型的数组。
<块引用>我们将如何让我们的动态数组能够处理 单个实例中的多种类型?提示:我们可能想要制作 [C联合]的使用
我以前从未使用过联合,而且我在网上找不到太多可以帮助我解决我需要的特定用例的内容。
我创建了这个工会,因为我认为这是必要的。
typedef union
{
float f;
int i;
long l;
char c;
char* s;
} element;
然后我将它插入到结构中,交换了这些行:
// char **elements; // The string elements contained in the array
element* elements; // TODO - make this work in place of the above
正如我所想的那样。
我编译了它,看看会发生什么。我遇到了很多不兼容的类型编译器错误。
我想知道我是否在正确的轨道上。您将如何使用联合来制作多种类型的数组?我怀疑它可能不需要对代码进行那么多更改,但如果它是一个大项目,我很乐意从头开始并为其构建一些功能。
我只是在寻找一些指示、方法或注意事项,以便走上正确的轨道。我怀疑不需要很多重构,但也许需要。
方法:
Array *create_array(int capacity);
void destroy_array(Array *arr);
char *arr_read(Array *arr, int index);
void arr_append(Array *arr, char *element);
void arr_insert(Array *arr, char *element, int index);
void arr_remove(Array *arr, char *element);
int arr_clear(Array *arr);
char* arr_pop(Array *arr);
int arr_pop_no_rtn(Array *arr);
int arr_copy(Array *src);
int arr_index(Array *arr, char *element);
int arr_reverse(Array *arr);
int arr_sort(Array *arr);
int arr_pop_by_index(Array *arr, int index);
int arr_extend(Array* arr, Array* arr2);
编辑: 我的一些编译错误包括:
arrays.c:218:39: error: incompatible types when assigning to type ‘element’ from type ‘void *’
218 | arr->elements[arr->count - 1] = NULL;
| ^~~~
arrays.c: In function ‘arr_clear’:
arrays.c:278:37: error: incompatible types when assigning to type ‘element’ from type ‘void *’
278 | arr->elements[arr->count - 1] = NULL;
| ^~~~
arrays.c: In function ‘arr_pop_no_rtn’:
arrays.c:289:37: error: incompatible types when assigning to type ‘element’ from type ‘void *’
289 | arr->elements[arr->count - 1] = NULL;
| ^~~~
arrays.c: In function ‘arr_pop’:
arrays.c:304:51: error: incompatible type for argument 1 of ‘strlen’
304 | int last_element_length = strlen(arr->elements[last_index]);
| ~~~~~~~~~~~~~^~~~~~~~~~~~
| |
| element
答案 0 :(得分:2)
您可以使用指向 element
元素数组的指针来实现变体数组,也可以使用指向可能元素类型的指针的联合,这在存储方面会更高效。
在这两种情况下,您都应该将元素的类型存储在某处。
您没有发布 API 中各种函数的代码,但处理您在 element
联合中声明的各种类型似乎需要做很多工作。