2016-08-02 35 views
-1

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

} 
+0

Ich fühle, dass einige Klammern fehlen. Sie sollten Ihre Arrays wirklich richtig formatieren. –

+0

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

+1

Und nochmal: [mcve] fehlt. Nächster! – Olaf

Antwort

1

Ihr Code kompiliert, wenn Sie ändern:

typedef tt_point tt_figure[4][4]; zu

typedef struct tt_point tt_figure[4][4];.

Zum Beispiel kompiliert dieser Code unten und läuft gut.

#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 */ 
} 

können Sie tun auch

typedef struct tt_point 
{ 
    int x; 
    int y; 
} tt_figure[4][4]; 

so dass Sie nicht versehentlich struct verpassen - wie Sie verpasst haben, wenn Sie separat einen typedef tat.

+0

Danke. Das Problem war, dass ich den Prototyp (?) Einer Funktion vergessen habe: 'typedef struct tt_point tt_figure [4] [4]; void tt_drawFigure (tt_figure figure); ' Hinzufügen von' void tt_drawFigure (tt_figure figure); 'hat den Trick gemacht. –

+0

Ich fand, dass das Schlüsselwort 'struct' unnötig war. Sogar 'typedef tt_point tt_figure [4] [4];' kompiliert gut (Vielleicht etwas Arduino-Geschmack von C?). –

+0

@AndreySolovyov Verwenden Sie C++? – melpomene

2

Dies ist nicht syntaktisch korrekt:

typedef tt_point tt_figure[4][4]; 

Sofern Sie erstellt zuvor ein typedef für tt_point, wird dies nicht kompilieren. Was Sie wollen, ist dies:

typedef struct tt_point tt_figure[4][4]; 

Das struct Schlüsselwort wird überall der Strukturtyp erforderlich verwendet wird. Wenn Sie dies tun, wird der Beispielcode sauber kompiliert.