TL; DR; Das Problem war, ich habe vergessen, einen Prototyp für eine Funktion zu schreiben. Addiert man diese das Problem behoben:Übergabe typedefed zweidimensionalen Array von Strukturen als Funktion Argument
void tt_drawFigure(tt_figure figure);
Volltext:
Ich schreibe einen tetris Klon für Arduino. In meiner Umsetzung habe ich ein struct
einen Punkt auf dem Bildschirm darstellt:
struct tt_point
{
int x;
int y;
};
Jede Figur eine Anordnung von seiner Rotation ‚Schnappschüsse‘ oder ‚Rahmen‘ ist. Jeder Frame ist ein Array von tt_points
, was eine Figur zu einem zweidimensionalen Array von tt_points
macht (Sie mögen es hässlich finden, aber die Frage ist nicht Design).
Ich möchte dieses zweidimensionale Array typedef eingeben und es an eine Funktion übergeben. Hier ist die typedef ich habe:
typedef tt_point tt_figure[4][4];
Und ein 'T' Figur:
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}}
};
Probleme beginnen, wenn ich versuche, eine Figur auf eine Funktion zu übergeben:
void tt_drawFigure(tt_figure figure) { ... }
Der Fehler ist:
Tetris:20: error: variable or field 'tt_drawFigure' declared void
Tetris:20: error: 'tt_figure' was not declared in this scope
Wie sollte ich umschreiben ite die Deklaration, um eine tt_figure
an eine Funktion zu übergeben?
P.S. Ich habe es funktioniert, indem eine Figur als void*
deklariert und dann Gießen zu 4x4-Array:
void tt_drawFigure(void* figure)
{
tt_point * fig = ((tt_point(*)[4]) figure)[frame_index];
...
}
Aber es soll ein schöner Weg sein.
UPDATE. Der Code, den Sie kopieren, einfügen und versuchen, zu kompilieren:
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)
{
}
Ich fühle, dass einige Klammern fehlen. Sie sollten Ihre Arrays wirklich richtig formatieren. –
Die Problemumgehung ist nicht nur hässlich, sondern auch sehr schlecht. Verwenden Sie niemals 'void *', es sei denn, es ist der einzige und beste Weg (es ist meistens keins). – Olaf
Und nochmal: [mcve] fehlt. Nächster! – Olaf