1

私は現在、自動チェッカーボードの開発に取り組んでいます。3つのクラスを使用してC++でコーディングし、Arduinoのライブラリとして使用するために必要な変更を加えました。C ++コードは、ボードの位置に対して8 x 8の配列を開始し、そのボード上のポーンの動きを追跡する3つのクラスに分けられます。

エラーなしでスケッチをコンパイルできるので、Arduinoライブラリへの変換は正しいと思います。しかし、それをADK Megaにアップロードすると、のような単純なコマンドでさえ、シリアルモニターにまったく応答がありませんSerial.print()

これはスケッチです:

#include <Board.h>

Board myBoard ;

int currentTurn=0;
int order[4][4]={{0,2,1,3},{1,5,2,4},{4,2,5,3},{2,4,0,2}};
int k=0;    
int *A;

void setup()
{
  pinMode(13, OUTPUT); 
  Serial.begin(9600);
}

void loop()
{
  A=myBoard.arr(); 
  for (int i=0; i<98; i++)
  {
     Serial.print(A[i]);
  }

 command[0]=order[k][0]; 
 command[1]=order[k][1];
 command[2]=order[k][2];
 command[3]=order[k][3];

  myBoard.processCommand(command,currentTurn); 

  if(myBoard.nextTurn())
  {
    if(currentTurn==0)
    { 
      currentTurn=1; 
      digitalWrite(13,HIGH);
      delay(3000);
    }
    else
    { 
      currentTurn=0;
      digitalWrite(13,LOW);
      delay(3000);    
    }      
  }
k++;
}

基本的に、クラスはポーンの位置に関する情報を持つ0と1の配列を返します。しかし、スケッチをアップロードするとすぐに何も起こりません!

なぜこれが起こっているのかについて誰かが考えていますか?

問題がそこにあるかもしれないと誰かが考える場合、これはBoardクラスのコンストラクターです

編集

 Board::Board()
{

    bool gameFinished=false;
    bool turnChange=false;
    initBoard();
    initPawns();

}

物事を単純化するためにコンストラクターを変更しました。これで、オブジェクトの配列がヘッダーのパブリックメンバーとして作成されます:PawnmyPawns[24]。プログラムが正しく実行され、配列を印刷できますが、void loop()の最初の反復でのみ、印刷された配列は空のボードに対応します(ポーンは存在しません)。最初の反復後(コンストラクターが呼び出されたとき)に、プログラムがポーンの配列に正しくアクセスしていないのではないかと思います。ポーンの配列を動的に割り当てると、この問題は解決しますか?

4

1 に答える 1

0

コンストラクターでは、小さなプロセッサにかなりのスタックを要求しています。

  • 24Pawn秒 - どんなに大きくても
  • 64intboard

Pawnaはバイト単位でどのくらいの大きさですか?

スタックが不足する可能性があります。メモリの種類と、スタック/ヒープが不足しているかどうかを確認する方法については、 このスレッドを参照してください。Arduinoメモリに関する別の便利なページ

1224 バイトは、合計で使用可能な 2048 (IIRC) のかなりの量です!

また、あなたはまったく呼び出していますかnew-それはRAMでもあるヒープを使用します。

編集: あなたのコメントから、クラスで1回、関数内のスタックで1、2回割り当てたように聞こえます-そうするつもりでしたか?

さらに編集:

ヘッダーに物を割り当てないでください。 extern次に、プロトタイプを作成するか、クラスに入れます。しかし、それらをそこに割り当てないでください!

クラス内にある場合Pawn myPawns[24]は、コンストラクターで宣言する必要はありません。

于 2012-05-10T09:00:22.757 に答える