c++ - Arduino Sketch 编译然后在上传时卡住

标签 c++ class arduino adk

我目前正在开发一个自动跳棋盘。我使用三个类在 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 组成的数组,其中包含有关 pawn 位置的信息。但是我一上传草图就没有任何反应!

有没有人知道为什么会发生这种情况?

如果有人认为问题可能出在这里,这就是 Board 类的构造函数

编辑

 Board::Board()
{

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

}

我更改了构造函数以简化操作。对象数组现在创建为 header 中的公共(public)成员:Pawn myPawns[24]。 该程序现在可以正确运行并且我能够打印数组,但只能打印 void loop() 中的第一次迭代,之后打印的数组对应于一个空板(不存在棋子)。 我怀疑程序在第一次迭代后(调用构造函数时)没有正确访问 Pawns 数组。 动态分配 Pawns 数组会解决这个问题吗?

最佳答案

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

  • 24 个 Pawn - 不管它们有多大
  • 64 个 int 用于 board

Pawn 有多少字节?

您可能会用完堆栈。查看this thread有关内存类型以及如何查看堆栈/堆是否用完的更多讨论。 Another useful page on Arduino memory

1224 字节对于总共可用的 2048 (IIRC) 来说是相当多的!

此外 - 您是否调用了 new - 这也将使用堆,它也是 RAM。

编辑: 从您的评论中可以看出,您分配了它们两次,一次在类中,一次在函数内部的堆栈上 - 您是故意这样做的吗?

更多编辑:

不要在 header 中分配内容。 extern 然后或原型(prototype)化它们,或将它们放入类中。但是不要在那里分配它们!

如果类中有 Pawn myPawns[24],则无需在构造函数中声明它。

关于c++ - Arduino Sketch 编译然后在上传时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10517850/

相关文章:

python - 在 python 中快速绘制数据

c++ - Controller 和 View 之间的耦合

ios - Swift UILabel子类自动调用enum switch函数

c++ - 使用 C++ 时出现错误 : no matching function for call to ,

c++ - Microsoft Visual C++ 2010 和 Arduino UNO 通过 USB 之间的串行通信

compiler-errors - 可以正常工作的Arduino UNO代码在ESP8266上编译错误-无匹配功能

c++ - 在内存充足但碎片化的环境下,new/malloc 是否会造成内存洗牌?

c++ - 在 Windows 10 上显示触摸友好菜单

c++ - 为什么数组匹配 std::extent 第二个 imp?

javascript - 使用 javascript 代码不是用于 id,而是用于类