如何解决如何在C中合并两个typedef结构数组
我知道也有类似的问题,但是我确实对使用结构体感到不满,而且我一般不擅长C语言。
我有两个结构体数组,我想将它们组合成一个结构体数组。我正在编写视频游戏命令脚本,所以其中一个数组是:
// Setup_Controller.c
command setup_controller[] = {
{ NOTHING,250 },{ TRIGGERS,5 },{ NOTHING,100 },};
另一个是
// Get_Eggs.c
command get_eggs[] = {
// Face and activate the lady
{ LEFT,{ A,.
.
.
{ LEFT,30 },{ UP,};
typedef就在这里:
// Joystick.h
// Declare Object...?
typedef struct {
Buttons_t button;
uint16_t duration;
} command;
最后的死刑在这里发生
// Joystick.c
#include
#include "Joystick.h"
#include "./Tasks/Setup_Controller.c"
#include "./Tasks/Get_Eggs.c"
command * merge_arrays( command a[],command b[],size_t a_size,size_t b_size ) {
size_t c_size = a_size + b_size;
/*allocate new array of sufficient size*/
command *c = malloc(c_size);
unsigned i;
/*copy elements from a into c*/
for(i = 0; i<a_size; ++i) {
c[i] = a[i];
}
/*copy elements from b into c*/
for(i = 0; i < b_size; ++i) {
c[a_size+i] = b[i];
}
return c;
}
size_t setup_controller_size = sizeof(setup_controller);
size_t get_eggs_size = sizeof( get_eggs );
size_t total_size = sizeof(setup_controller) + sizeof( get_eggs );
command step[total_size] = merge_arrays(setup_controller,get_eggs,setup_controller_size,get_eggs_size);
我已经用棍子戳了几个小时了。我几乎可以用一些有关如何合并数组的代码来工作,但是当我尝试使用这些元素之一的大小时,它总是抛出错误。那个错误是这样的:
invalid application of 'sizeof' to incomplete type 'command[]' {aka 'struct <anonymous>[]'}
全部(而不是数组A和数组B)具有一个数组C,该数组首先包含A的所有元素,然后包含B的所有元素,并保留其原始顺序。不知道为什么会变成这样的麻烦,但是我们在这里。
最小可复制示例:
//// main.c ////
#include "main.h"
#include "script.c"
#include <stdlib.h>
#include <string.h>
void merge_arrays( data *a,data *b,data *c,size_t b_size ) {
memcpy(c,a,a_size);
memcpy(((unsigned char *)c) + a_size,b,b_size);
}
size_t script1_size = sizeof(script1);
size_t script2_size = sizeof(script2);
merge_arrays(data *script1,data *script2,data *whole_thing,size_t b_size);
。
//// main.h ////
typedef struct {
int age;
int height;
} data;
。
//// script.c ////
#include "script.h"
data script1[] = {
{ 123,{ 123,};
data script2[] = {
{ 123,};
。
//// script.h ////
extern data script1[];
extern data script2[];
产生的错误:
.../Documents/test/main.c:20:1: warning: type specifier missing,defaults to 'int' [-Wimplicit-int]
merge_arrays(data *script1,^
/Users/.../Documents/test/main.c:20:1: error: conflicting types for 'merge_arrays'
/Users/.../Documents/test/main.c:10:6: note: previous definition is here
void merge_arrays( data *a,^
1 warning and 1 error generated.
解决方法
a_size
和b_size
的大小以字节为单位,因为这就是sizeof
产生的大小,但是在C语言中数组索引的通常方式中,c[i]
进行计数的元素。因此,例如,如果command
的大小为4,则您索引的元素太多了4倍。
更改merge_arrays
来代替元素数量的计数,并以sizeof(get_eggs) / sizeof(command)
作为参数来调用它可能会更惯用。然后确保调整malloc
调用以将其参数乘以sizeof(command)
。
但更好的方法是只使用memcpy
,它以字节为单位工作,并且可能更有效:
memcpy(c,a,a_size);
memcpy(((unsigned char *)c) + a_size,b,b_size);
强制转换c
以确保+
以字节为单位而不是以sizeof(command)
为单位。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。