【问题标题】:using unions inside of structs to enable arrays of multiple types在结构中使用联合来启用多种类型的数组
【发布时间】: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* elementselement 结构的数组。但是您将 NULL 指针分配给每个元素。元素不是指针。同样,我们需要完整的代码。您甚至没有显示这些错误来自的代码。我们无法有效地帮助我们看不到的代码。

标签: c struct unions


【解决方案1】:

您可以使用指向element 元素数组的指针来实现变体数组,或者您可以使用指向可能元素类型的指针的联合,这在存储方面会更有效。

在这两种情况下,您都应该将元素的类型存储在某处。

您没有在 API 中发布各种函数的代码,但似乎需要做很多工作来处理您在 element 联合中声明的各种类型。

【讨论】:

  • 确实如此。 Array *create_array(int capacity); 不能用于可变类型数组,如果你不传递它的类型。
  • 谢谢!如果你想要整个代码,我可以给它,但它是 500 行。可以压缩到大约 400,但这包括我编写的每个函数。我可能会从头开始构建一个可以处理多重类型的数组,只需使用一种或两种方法——明天。
  • @AndrewHenle:使用建议的element *elements;方法,它可以工作,因为可以分配空间,不需要初始化element
  • @gcr:还不需要发布整个代码...玩得开心编码:)
猜你喜欢
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多