1

我目前正在开发一个自动跳棋板。我已经使用三个类在 C++ 中对其进行了编码,然后进行了必要的更改以将其用作 Arduino 上的库。C++ 代码分为三个类,它们为棋盘的位置启动一个 8 x 8 数组,并跟踪棋盘上棋子的移动。

我认为转换为 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();

}

我已经更改了构造函数以简化事情。对象数组现在被创建为标题中的公共成员:Pawn myPawns[24]。程序现在可以正常运行,我可以打印数组,但仅限于 void loop() 中的第一次迭代,之后打印的数组对应于空棋盘(不存在棋子)。我怀疑程序在第一次迭代后没有正确访问 Pawns 数组 - 当调用构造函数时 - 。动态分配 Pawns 数组会解决这个问题吗?

4

1 回答 1

0

在您的构造函数中,您要求为小型处理器提供大量堆栈:

  • 24Pawn秒 - 不管它们有多大
  • 64intboard

a 有多大(Pawn以字节为单位)?

你可能会用完堆栈。查看此线程以获取有关内存类型以及如何查看是否已用完堆栈/堆的更多讨论。 另一个关于 Arduino 内存的有用页面

总共可用的 2048 (IIRC) 中有 1224 个字节!

另外-您是否new在调用-这将使用也是RAM的堆。

编辑: 从您的评论中听起来您已经分配了两次,一次在类中,一次在函数内的堆栈中-您是要这样做吗?

更多编辑:

不要在标题中分配东西。 extern然后或将它们原型化,或将它们放入类中。但不要在那里分配它们!

如果你Pawn myPawns[24]在类里面,你不需要在构造函数中声明它。

于 2012-05-10T09:00:22.757 回答