将typedefed二维结构数组作为函数参数

时间:2016-08-02 20:14:49

标签: c arrays struct arduino typedef

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)
{

}

2 个答案:

答案 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时错过了一样。