【发布时间】:2021-04-10 18:18:31
【问题描述】:
我在 C 中基于 struct 构建了一个动态分配的数组
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 union]
我以前从未使用过联合,我在网上找不到太多可以帮助我解决我需要的特定用例的信息。
我创建了这个联盟,因为我认为这是必要的。
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
【问题讨论】:
-
el* elements;el是什么?您已显示element类型,但未显示el类型。请将准确的完整代码显示为minimal verifiable example,并提供准确的错误消息。这种方法听起来一般都很好,所以如果你有特定的错误,你需要询问这些。 -
哦,是的,谢谢。编辑了我的问题。
-
element* elements是element结构的数组。但是您将NULL指针分配给每个元素。元素不是指针。同样,我们需要完整的代码。您甚至没有显示这些错误来自的代码。我们无法有效地帮助我们看不到的代码。