C 使用结构内部的联合来启用多种类型的数组

C 使用结构内部的联合来启用多种类型的数组,c,struct,unions,C,Struct,Unions,我在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; 使用一系列不同的方法(如下)。它是通过设计一个字符串数组(字符

我在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;

使用一系列不同的方法(如下)。它是通过设计一个字符串数组(字符**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

可以使用指向
元素
元素数组的指针来实现变量数组,也可以使用指向可能元素类型的指针的并集,这样在存储方面会更有效

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


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

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

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


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

el*元素什么是
el
?您显示了
元素
类型,但未显示
el
类型。请以a的形式显示准确完整的代码,并提供准确的错误MSG。这种方法听起来很好,所以如果你有具体的错误,你需要问一下。哦,是的,谢谢你。编辑了我的问题。
element*elements
element
结构的数组。但是您正在为每个元素分配
NULL
指针。这些元素不是指针。同样,我们需要完整的代码。您甚至还没有显示这些错误来自的代码。对于看不见的代码,我们无能为力。
el*元素什么是
el
?您显示了
元素
类型,但未显示
el
类型。请以a的形式显示准确完整的代码,并提供准确的错误MSG。这种方法听起来很好,所以如果你有具体的错误,你需要问一下。哦,是的,谢谢你。编辑了我的问题。
element*elements
element
结构的数组。但是您正在为每个元素分配
NULL
指针。这些元素不是指针。同样,我们需要完整的代码。您甚至还没有显示这些错误来自的代码。我们不能有效地帮助那些我们看不见的代码<代码>数组*创建数组(整数容量)无法用于可变类型数组。谢谢!如果你想要完整的代码,我可以给你,但是有500行。可以压缩到400,但这包括了我写的每个函数。我可能会从头开始,构建一个可以处理多个EL类型的数组,只需使用一个或两个方法——明天。@AndrewHenle:使用建议的
element*元素方法,它可以工作,因为可以分配空间,并且不需要初始化
元素
。@gcr:还不需要发布整个代码。。。享受编码的乐趣:)真的<代码>数组*创建数组(整数容量)无法用于可变类型数组。谢谢!如果你想要完整的代码,我可以给你,但是有500行。可以压缩到400,但这包括了我写的每个函数。我可能会从头开始,构建一个可以处理多个EL类型的数组,只需使用一个或两个方法——明天。@AndrewHenle:使用建议的
element*元素方法,它可以工作,因为可以分配空间,并且不需要初始化
元素
。@gcr:还不需要发布整个代码。。。享受编码乐趣:)