需要帮助创建Arduino (c/c++)的无限数组
Need help creating a boundless array for Arduino (c/c++)
我正试图制作一个arduino Simon说的副本,孩子们的游戏,你按颜色在相同的连续他们出现之前,在学校独立学习的快乐棒。我认为我到目前为止所拥有的将或将工作,然而我所做的数组给了我"错误:'setOrder'的存储大小是未知的",这是有意义的,因为我已经声明它为"int setOrder[];",但这正是我想要的。数组在创建时没有变量,但可以随着游戏进程添加变量……这是我在我的代码到目前为止,请告诉我它是什么样子的,以及我如何可以使这样的数组。谢谢你! !
int xAxis = A0;
int yAxis = A1;
int push = 6;
int blue = 9;
int yellow = 10;
int green = 11;
int red = 12;
int play = 0;
int setOrder[]; /* HERE IS THE PROBLEM */
void setup()
{
Serial.begin(9600);
pinMode(blue, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(green, OUTPUT);
pinMode(red, OUTPUT);
pinMode(push, INPUT);
digitalWrite(push, HIGH);
}
void loop()
{
if(!digitalRead(push)){
play = 1;
Serial.println("start!");
}
if(play = 1){
for(int i = 0; i<=sizeof(setOrder); i++){
setOrder[i] = random(1, 4);
for(int j = 0; j<=sizeof(setOrder); j++){
int k = setOrder[j];
if(k=1){
digitalWrite(blue, HIGH); delay(750); digitalWrite(blue, LOW);
}
if(k=2){
digitalWrite(yellow, HIGH); delay(750); digitalWrite(yellow, LOW);
}
if(k=3){
digitalWrite(green, HIGH); delay(750); digitalWrite(green, LOW);
}
if(k=4){
digitalWrite(red, HIGH); delay(750); digitalWrite(red, LOW);
}
}
int playback[sizeof(setOrder)];
for(int l = 0; l<=sizeof(playback); l++){
//player presses RIGHT green led
if(analogRead(xAxis) > 600){
playback[l] = 4;
if(playback[l] == setOrder[l]){
digitalWrite(green, HIGH);
}
else{
digitalWrite(green, HIGH); digitalWrite(blue, HIGH); digitalWrite(yellow, HIGH); digitalWrite(red, HIGH);
play = 0;
break;
}
}
//player presses LEFT yellow led
if(analogRead(xAxis) < 400){
playback[l] = 2;
if(playback[l] == setOrder[l]){
digitalWrite(yellow, HIGH);
}
else{
digitalWrite(green, HIGH); digitalWrite(blue, HIGH); digitalWrite(yellow, HIGH); digitalWrite(red, HIGH);
play = 0;
break;
}
}
//player presses DOWN blue led
if(analogRead(yAxis) > 600){
playback[l] = 1;
if(playback[l] == setOrder[l]){
digitalWrite(blue, HIGH);
}
else{
digitalWrite(green, HIGH); digitalWrite(blue, HIGH); digitalWrite(yellow, HIGH); digitalWrite(red, HIGH);
play = 0;
break;
}
}
//player presses UP red led
if(analogRead(yAxis) < 400){
playback[l] = 3;
if(playback[l] == setOrder[l]){
digitalWrite(red, HIGH);
}
else{
digitalWrite(green, HIGH); digitalWrite(blue, HIGH); digitalWrite(yellow, HIGH); digitalWrite(red, HIGH);
play = 0;
break;
}
}
}
}
}
}
我也不确定我是否正确使用了"break();"方法,如果有人能告诉我那就太好了!再次感谢。
我建议你看看std::vector。
在您检查if (play = 1)
后的第一行,您使用sizeof(setOrder)
运行for循环,而不首先将数据放入setOrder
。即使这确实可以编译,从逻辑上讲,您的代码也总是会跳过循环。一旦你弄清楚向量(我很确定这是你正在寻找的),你可能想把它改变为检查你的setOrder
向量的大小,反对预定义的最大值(在哪个点上玩家获胜?)。
这是我从谷歌上找到的矢量教程。
还有一些其他可能的错误/建议:
- 将循环分解为几个可以调用的子函数,这样阅读代码就不是一个巨大的块。这也将使查找错误更容易,因为您可以检查每个函数是否工作,一次一个函数。
- 当你检查
if (play = 1)
时,你实际上使用的是赋值=
运算符,而不是条件检查==
。你将1
的值赋给play
,而不是检查play
是否等于1
。 - 您使用
sizeof(setOrder)
错误。sizeof(X)
返回X
占用的字节数,不一定是X
中的元素数。如果使用矢量,则有一个vector.size()函数返回矢量 中的元素数量。 - 当你检查玩家的行动时,你调用
analogRead(xAxis)
四次——每个方向一次。玩家的第一次输入总是会在第一次调用中被检查。如果它为假,玩家将需要提供另一个输入以使其进入第二个If语句。
对于方向检测,您可能会看到这样的内容:
enum Directions {
Center,
Left,
Right,
Up,
Down
}
const int threshold = 100;
int getJoyStick()
{
// get the X,Y coordinates with 0,0 the centre
int x = analogRead(xAxis) - 500;
int y = analogRead(yAxis) - 500;
/check if we are in the middle. Both X and Y need to be small for this to happen
if (abs(x) < threshold && abs(y) < threshold) return Center;
//to detect up, down, left, right draw diagonals at 45 degrees from the centre
//if we are more to the right than we are up or down, then it is Right. This
//is to cope if it isn't exactly horizonal or vertical
//so y big might mean up, but if x is bigger, than it is actually to the right
if (x>y) {
if (x>-y) return Right; else return Down;
}
else {
if (x>-y) return Up; else return Left;
}
}
枚举只是为了展示这样做的好方法。所有的代码都是一样的。但是,如果对您来说更简单,您可以为每个方向返回数字代码。
如果你使用的是c++语言,就像你帖子中的c++标签建议的那样,请使用std::vector而不是array。
vector是在程序执行过程中可以增长的列表。这是一个关于vector的文档
如果要使用普通的旧C数组,最简单的路径是使用静态长度的数组,长度足以接受最大数量的条目。然后保留一个单独的计数器,表示当前使用了多少数组。
const int MAX_ORDER_LENGTH = 1024;
int setOrder[MAX_ORDER_LENGTH];
int setOrderSize = 0; //the number of entries currently used
当你添加条目时,确保setOrderSize小于MAX_ORDER_LENGTH。
注意sizeof(setOrder)并没有给出数组中元素的个数。它实际上是该结构占用的字节数。
休息;命令将把您从最内层的for循环中删除,但不会从最外层的for循环中删除。
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 循环无限运行C++解决骑士之旅问题
- 过载'operator new'如何导致无限循环?
- 在Qt中实现无限可缩放的画布
- C++正则表达式无限循环
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 交换运算符 + 重载会导致无限递归
- 无限嵌套具有变体的地图
- 遍历链表时的无限循环
- 循环链表:无限循环
- 比较两个字符串后卡在无限循环中
- 在做一段时间内检查字符的无限循环
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 可能的无限循环
- 超出 int 的值范围后的无限循环
- 为什么这段代码会导致无限循环?
- 运行无限循环的最小二叉树问题
- USplineComponent Bounds SphereRadius 失败无限
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?