2016-08-02 18 views
-1

TL; DR; 問題は、関数のプロトタイプを書くのを忘れてしまったことです。私はArduinoのためのテトリスクローンを作成するtypedefed構造体の2次元配列を関数引数として渡す

void tt_drawFigure(tt_figure figure); 

本文:これを追加すると、問題を修正しました。私の実装で は、私は、画面上の点を表すstruct有する:

struct tt_point 
{ 
    int x; 
    int y; 
}; 

各図は、その回転「snaphots」または「フレーム」の配列です。各フレームはtt_pointsの配列で、Figureをtt_pointsの2次元配列にしています(あなたは醜いかもしれませんが、デザインに関する問題ではありません)。

この2次元配列をtypedefして関数に渡したいと思います。ここで私が持っている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 

どのように私はrewr関数にtt_figureを渡す宣言はありますか?

P.S.私はvoid*として数字を宣言することによって、それが働いて作られ、その後、4×4の配列にキャスト:

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

私はいくつかの括弧がないと感じています。実際に配列を適切にフォーマットする必要があります。 –

+0

回避策は醜いだけではなく、非常に悪いことです。それが唯一の最良の方法でない限り、 'void *'を使用しないでください。ほとんどの時間はnoneです。 – Olaf

+1

もう一度:[mcve]が見つかりません。次! – Olaf

答えて

1

あなたのコードは、あなたが変更した場合はコンパイルされます。

たとえば、以下のコードはコンパイルして正常に動作します。

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

誤っstructを見逃さないように、また、

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

を行うことができます - あなたは、別途typedefをしたとき、あなたは逃したように。

+0

ありがとうございます。問題は、関数のプロトタイプ(?)を忘れていたことです。 'typedef struct tt_point tt_figure [4] [4]; void tt_drawFigure(tt_figure figure); ' ' void tt_drawFigure(tt_figure figure);を追加すると、そのトリックが実行されました。 –

+0

キーワード 'struct'は不要であることがわかりました。 'typedef tt_point tt_figure [4] [4];'はうまくコンパイルされます(おそらくCのarduino風味ですか?)。 –

+0

@AndreySolovyov C++を使用していますか? – melpomene

2

これは文法的に正しくありません:

typedef tt_point tt_figure[4][4]; 

以前tt_pointためtypedefを作成していない限り、これはコンパイルに失敗します。何が欲しいのはこれです:

typedef struct tt_point tt_figure[4][4]; 

structキーワードはどこにでも構造体の種類が使用されている必要があります。これを行うと、サンプルコードはきれいにコンパイルされます。

typedef tt_point tt_figure[4][4];

typedef struct tt_point tt_figure[4][4];へ:

関連する問題