我目前正致力于开发自动跳棋板。我使用三个类在C ++中编写它,然后进行必要的更改以将其用作Arduino上的库。 C ++代码分为三个类,它们为电路板的位置启动一个8乘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的数组,其中包含有关pawn位置的信息。但是一上传草图就没有任何事情发生!
有没有人知道为什么会发生这种情况?
如果有人认为问题可能存在,那么这是Board类的构造函数
修改
Board::Board()
{
bool gameFinished=false;
bool turnChange=false;
initBoard();
initPawns();
}
我更改了构造函数以简化操作。现在,对象数组在标题中创建为公共成员:Pawn myPawns [24]。 该程序现在正确运行,我能够打印数组,但只能在void loop()中的第一次迭代,之后打印的数组对应一个空板(没有pawn存在)。 我怀疑程序在第一次迭代后没有正确访问Pawns数组 - 当构造函数被调用时 - 。 动态分配Pawns数组会解决这个问题吗?
答案 0 :(得分:0)
在你的构造函数中,你为小型处理器要求相当多的堆栈:
Pawn
s - 无论多大int
board
s
Pawn
以字节为单位有多大?
你可能用完了堆栈。查看this thread以获取有关内存类型以及如何查看堆栈/堆耗尽的更多讨论。 Another useful page on Arduino memory
1224字节是2048(IIRC)中相当多的可用的总数!
另外 - 你是否正在调用new
- 它也将使用堆也是RAM。
修改强> 从你的评论中听到你已经分配了两次,一次在课堂上,一次在函数内的堆栈上 - 你的意思是这样做吗?
更多编辑
不要在标题中分配内容。 extern
然后或原型,或将它们放在课堂上。但是不要在那里分配它们!
如果课程中有Pawn myPawns[24]
,则不需要在构造函数中声明它。