TL; DR; 问题是我忘了为函数编写原型。添加此项修复了问题:
void tt_drawFigure(tt_figure figure);
全文:
我为Arduino写了一个俄罗斯方块克隆。
在我的实现中,我有一个struct
代表屏幕上的一个点:
struct tt_point
{
int x;
int y;
};
每个数字都是旋转'snaphots'或'frames'的数组。每个帧都是tt_points
的数组,这使得数字成为tt_points
的二维数组(你可能会发现它很难看,但问题不在于设计)。
我想键入这个二维数组并将其传递给函数。这是我的typedef:
typedef tt_point tt_figure[4][4];
和'T'数字:
tt_figure tt_T = {
{{0,0}, {0,1}, {0,2},
{1,1}},
{{0,1},
{1,0}, {1,1},
{2,1}},
{{0,1},
{1,0}, {1,1}, {1,2}},
{{0,0},
{1,0}, {1,1},
{2,0}}
};
当我尝试将数字传递给函数时出现问题:
void tt_drawFigure(tt_figure figure) { ... }
错误是:
Tetris:20: error: variable or field 'tt_drawFigure' declared void
Tetris:20: error: 'tt_figure' was not declared in this scope
我应该如何重写声明以将tt_figure
传递给函数?
P.S。我通过将一个数字声明为void*
然后转换为4x4数组来实现它的工作:
void tt_drawFigure(void* figure)
{
tt_point * fig = ((tt_point(*)[4]) figure)[frame_index];
...
}
但应该有一个更好的方式。
更新。 您可以复制,粘贴和尝试编译的代码:
struct tt_point
{
int x;
int y;
};
typedef tt_point tt_figure[4][4];
tt_figure tt_T = {
{{0,0}, {0,1}, {0,2},
{1,1}},
{{0,1},
{1,0}, {1,1},
{2,1}},
{{0,1},
{1,0}, {1,1}, {1,2}},
{{0,0},
{1,0}, {1,1},
{2,0}}
};
void setup()
{
}
void loop()
{
}
void tt_drawFigure(tt_figure figure)
{
}
答案 0 :(得分:2)
这在语法上不正确:
typedef tt_point tt_figure[4][4];
除非您之前为typedef
创建了tt_point
,否则将无法编译。你想要的是这个:
typedef struct tt_point tt_figure[4][4];
在使用struct类型的任何地方都需要struct
关键字。如果这样做,示例代码将完全编译。
答案 1 :(得分:1)
如果您更改了代码,则会编译:
typedef tt_point tt_figure[4][4];
到
typedef struct tt_point tt_figure[4][4];
。
例如,下面的代码编译并运行正常。
#include<stdio.h>
struct tt_point
{
int x;
int y;
};
/* typedef tt_point tt_figure[4][4]; /* /* Issue here */
typedef struct tt_point tt_figure[4][4]; /* add `struct' to typedef */
void tt_drawFigure(tt_figure figure);
tt_figure tt_T = { {{0,0}, {0,1}, {0,2}, {1,1}},
{{0,1}, {1,0}, {1,1},{2,1}},
{{0,1}, {1,0}, {1,1},{1,2}},
{{0,0}, {1,0},{1,1}, {2,0}}
};
int main(void)
{
tt_drawFigure(tt_T);
return 0;
}
void tt_drawFigure(tt_figure figure)
{
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++)
printf("%d, %d --- ", figure[i][j].x, figure[i][j].y);
printf("\n");
}
/* Do your drawing */
}
您也可以
typedef struct tt_point
{
int x;
int y;
} tt_figure[4][4];
这样您就不会意外地错过struct
- 就像您在单独执行typedef
时错过了一样。