arrays - 如何正确初始化 C 结构数组
问题描述
我的问题是我不知道如何正确初始化包含要在小型矩阵显示器上绘制的块的数组。初始化第一个对象有时会起作用(块),但通过 for 循环初始化剩余对象似乎没有任何作用。我会很高兴有任何帮助!
结构:
#define MAX_POINTS 50
#define ARRAYSIZE 2
typedef enum {false, true} bool;
typedef struct tpoint {
uint8_t x;
uint8_t y;
} POINT;
typedef struct tGeometery {
int numpoints;
int sizex;
int sizey;
POINT px[ MAX_POINTS ];
} GEOMETRY, *PGEOMETRY;
typedef struct tObj {
PGEOMETRY geo;
int dirx,diry;
int posx,posy;
void (* draw_object ) (struct tObj *, bool draw);
void (* move_object ) (struct tObj *);
void (* set_object_speed ) (struct tObj *, int, int);
} OBJECT, *POBJECT;
“对象”:
GEOMETRY ball_geometry = {
12, //Numpoints
4,4, //size X,Y
{
{1,0},{2,0},
{0,1},{1,1},{2,1},{3,1},
{0,2},{1,2},{2,2},{3,2},
{1,3},{2,3}
}
};
OBJECT ball = {
&ball_geometry,
0,0, //Direction
10,1, //Start position
draw_object,
move_object,
set_object_speed
};
GEOMETRY slab_geometry = {
30, //Numpoints
10,3, //Size X,Y
{
{0,0},{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0},{9,0},
{0,1},{1,1},{2,1},{3,1},{4,1},{5,1},{6,1},{7,1},{8,1},{9,1},
{0,2},{1,2},{2,2},{3,2},{4,2},{5,2},{6,2},{7,2},{8,2},{9,2}
}
};
OBJECT slab = {
&slab_geometry,
0,0, //Direction
59,61, //Start position (128/2 - 5)
draw_object,
move_object,
set_object_speed
};
GEOMETRY block_geometry = {
4, //Numpoints
2,2, //Size X,Y
{
{0,0},{1,0},
{1,0},{1,1}
}
};
OBJECT block = {
&block_geometry,
0,0, //Direction
0,0, //Start position
draw_object,
move_object,
set_object_speed
};
主要的:
void main(void) {
graphic_init();
keypad_init();
POBJECT bouncer = &ball;
POBJECT paddle = &slab;
POBJECT targetArray[ARRAYSIZE];
targetArray[0] = █
for (int i = 1; i < ARRAYSIZE; i++) {
targetArray[i] = █
targetArray[i]->posx = targetArray[i-1]->posx+3;
}
bouncer->set_object_speed(bouncer,4,1);
paddle->draw_object(paddle,true);
for (int i = 0; i < ARRAYSIZE; i++) {
targetArray[i]->draw_object(targetArray[i],true);
}
while(1) {
bouncer->move_object(bouncer);
}
}
解决方案
正在做
POBJECT targetArray[ARRAYSIZE]; targetArray[0] = █ for (int i = 1; i < ARRAYSIZE; i++) { targetArray[i] = █ targetArray[i]->posx = targetArray[i-1]->posx+3; }
targetArray的所有元素都是相同的(例如block),这不是您想要的,因为要做
targetArray[i]->posx = targetArray[i-1]->posx+3;
实际上与以下内容相同:
targetArray[0]->posx = targetArray[0]->posx+3;
最终做到了:
block.posx = block.posx+3;
和
for (int i = 0; i < ARRAYSIZE; i++) { targetArray[i]->draw_object(targetArray[i],true); }
与以下内容相同:
for (int i = 0; i < ARRAYSIZE; i++) {
targetArray[0]->draw_object(targetArray[0],true);
}
最终做到了:
for (int i = 0; i < ARRAYSIZE; i++) {
block.draw_object(&block,true);
}
你为什么这么做
POBJECT targetArray[ARRAYSIZE];
而不是
OBJECT targetArray[ARRAYSIZE];
并在tObj
PGEOMETRY geo;
而不是
GEOMETRY geo;
?
使用POBJECT和PGEOMETRY您需要为targetArray的每个条目和每个字段geo一个新元素,例如
targetArray[0] = malloc(sizeof(*(targetArray[0])));
*(targetArray[0]) = block;
targetArray[0]->geo = malloc(sizeof(*(targetArray[0]->geo)));
*(targetArray[0]->geo) = *(block.geo);
for (int i = 1; i < ARRAYSIZE; i++) {
targetArray[i] = malloc(sizeof(*(targetArray[i])));
*(targetArray[i]) = block;
targetArray[i]->geo = malloc(sizeof(*(targetArray[i]->geo)));
*(targetArray[i]->geo) = *(block.geo);
targetArray[i]->posx = targetArray[i-1]->posx+3;
}
但使用OBJECT和GEOMETRY:
targetArray[0] = block;
for (int i = 1; i < ARRAYSIZE; i++) {
targetArray[i] = block;
targetArray[i].posx = targetArray[i-1].posx+3;
}
通过 a 隐藏指针是一个坏主意typedef
,我鼓励您永远不要这样做以使*
可见。
我也不明白你为什么这样做
POBJECT bouncer = &ball; POBJECT paddle = &slab;
而不是在main中使用ball和slab
也主要返回一个int
,而不是void
推荐阅读
- javascript - Playwright Allure 报告没有显示我之前的试运行视频?
- apache-spark - 为 Spark MLlib 管道设置自定义参数
- mysql - ODBC - 通过 IIB(IBM 集成总线)在 AWS Workspace 中集成 Windows 身份验证未按预期工作
- javascript - JavaScript 中的语法 - 如何调用打印功能?
- ios - 如何使用 dlopen 和 dlsym 从 Apple 公共框架访问符号?
- google-signin - 我想隐藏在 Unity 中使用 Google 登录时出现的 Toast
- javascript - 在反应中更改外部库组件的 CSS 样式
- postgresql - postgres 使用 LIKE 或 ILIKE 关键字查询不以给定字符集开头的字符串
- javascript - 赛普拉斯 POST 请求,如何访问响应正文的“字段”部分
- ios - Swift & FCM:从后台切换到前台时如何获取推送通知数据?