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

时间:2021-01-04 23:55:19

标签: 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;

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

1 个答案:

答案 0 :(得分:2)

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

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

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

相关问题