Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要帮助为Arduino创建无限数组(c/c+;+;)_C++_C_Arrays_Arduino_Break - Fatal编程技术网

C++ 需要帮助为Arduino创建无限数组(c/c+;+;)

C++ 需要帮助为Arduino创建无限数组(c/c+;+;),c++,c,arrays,arduino,break,C++,C,Arrays,Arduino,Break,我正在尝试制作一个Simon Says的arduino复制品,这是一个儿童游戏,在游戏中,你可以按之前出现的相同顺序按下颜色,并使用一个快乐棒在学校进行独立学习。我想我到目前为止所做的一切都能工作,但我制作的数组给了我“错误:'setOrder'的存储大小未知”,这很有意义,因为我已经将其声明为“int setOrder[];”,但这正是我想要的。一个数组,创建时没有变量,但可以随着游戏的进行添加变量。。。这是到目前为止我的代码中的内容,请告诉我它的外观,以及如何生成这样的数组。谢谢 int x

我正在尝试制作一个Simon Says的arduino复制品,这是一个儿童游戏,在游戏中,你可以按之前出现的相同顺序按下颜色,并使用一个快乐棒在学校进行独立学习。我想我到目前为止所做的一切都能工作,但我制作的数组给了我“错误:'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;
           }
       }

     }

   }

 }

}
intxaxis=A0;
int yAxis=A1;
int-push=6;
int蓝色=9;
int黄色=10;
绿色整数=11;
红色整数=12;
int play=0;
int setOrder[];/*问题就在这里*/
无效设置()
{
Serial.begin(9600);
pinMode(蓝色,输出);
pinMode(黄色,输出);
引脚模式(绿色,输出);
pinMode(红色,输出);
pinMode(推送、输入);
数字写入(推、高);
}
void循环()
{
如果(!数字读取(推送)){
play=1;
Serial.println(“开始!”);
} 
如果(播放=1){

对于(int i=0;i )如果你在C++语言中,就像你的帖子中的C++标签所建议的那样,使用<强> STD::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)并没有给出数组中的条目数,它实际上是结构占用的字节数


break;命令将使您脱离最内层的for循环,而不是最外层的for循环。

我建议您查看std::vector

在您检查主播放区域后的第一行,您使用
sizeof(setOrder)
运行for循环,而不必先将数据放入
setOrder
中。即使编译了,从逻辑上讲,您的代码也会跳过循环。一旦您找到向量(我很确定这就是您要查找的向量),您可能希望将此更改为根据预定义的最大值(玩家在哪一点获胜?)检查
setOrder
向量的大小

这是一个例子

此外,这里还有一些其他可能的错误/建议:

  • 将循环分解为几个可以调用的子函数,这样读取代码就不会成为一个巨大的障碍。这也会使查找错误变得更容易,因为您可以检查每个函数是否工作,一次一个函数
  • 当您检查
    if(play=1)
    时,实际上您使用的是赋值
    =
    运算符,而不是条件检查
    =
    。您将
    1
    的值赋值给
    play
    ,而不是检查
    play
    是否等于
    1
  • 您使用的
    sizeof(setOrder)
    不正确。
    sizeof(X)
    返回占用的字节数
    X
    不一定是
    X
    中的元素数。如果使用向量,则有一个vector.size()函数返回向量中的元素数
  • 当你检查玩家的动作时,你调用
    analogRead(xAxis)
    四次-每个方向一次。玩家的第一次输入将始终在第一次调用中被检查。如果为false,玩家将需要给出另一个输入,以使其进入第二个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;
    }
}
枚举方向{
居中
左边
正确的,
向上的
向下
}
常数int阈值=100;
int getgooding()
{
//得到以0,0为中心的X,Y坐标
int x=模拟读取(xAxis)-500;
int y=模拟读数(yAxis)-500;
检查我们是否处于中间状态,X和Y都需要很小。
如果(abs(x)<临界值&abs(y)<临界值)返回中心;
//要检测上、下、左、右,请在距离中心45度处绘制对角线
//如果我们更偏向右边,而不是向上或向下,那么这就是对的
//如果它不是水平的或垂直的,就要处理
//所以y大可能意味着向上,但如果x大,它实际上就在右边
如果(x>y){
如果(x>-y)向右返回,否则向下返回;
}
否则{
如果(x>-y)向上返回,否则向左返回;
}
}

枚举只是为了展示一种很好的方法。你可以在所有代码中使用相同的代码。但是如果对你来说更简单,你可以只返回每个方向的数字代码。

你考虑过c++吗?你需要一个单独的代码块来向setOrder添加新项。我对c++的std::vect完全不熟悉或者,不确定它是否支持在ARDUINO……我所知道的是ARDUNO是用C和C++制作的,还有一些方法。谢谢,我会给你们一个尝试。谢谢你们的更正,我应该怎么做而不是sieof(StError)?我还计划研究向量,我对向量一无所知,所以视频会很有帮助。这是关于输入的一个很好的观点…我可以制作一个临时变量,将其设置为等于玩家的动作,然后通过每个if语句运行变量,这样他们就不需要为一个移动进行多个输入了吗?是的,这可以工作。我我也不确定你是如何确定“输入何时完成”——是什么使循环无法尽快读取一百(或一千,或一百万)个输入,从而导致播放器立即丢失?我不确定我是否理解你的意思……我的想法是,一个随机颜色(由用户选择并存储为数字1-4)在一个虚拟环境中