Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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++中,我如何访问多维数组中的值?_C++_Arrays_Multidimensional Array_Arduino - Fatal编程技术网

在C++中,我如何访问多维数组中的值?

在C++中,我如何访问多维数组中的值?,c++,arrays,multidimensional-array,arduino,C++,Arrays,Multidimensional Array,Arduino,谢谢你的关注 出身背景 我正在建造一架四旋翼直升机,在每一个臂上我都放置了一条RGB可寻址LED。我用一个ARDUINO来驱动灯光,而ARDUNO代码是C++,一种我不太熟悉的语言。 我发布了关于我以前遇到的关于此代码的问题的帖子。如果你感兴趣的话,它会给你更多的背景信息,让你知道我到底想做什么 问题 由于我的答案,我现在已经正确地编写了数组gpsHoldArr,但是我在访问它的值时遇到了困难 在下面的代码中,我调用toggleightsgpsholdarr[x][y]并传入gpsHoldArr

谢谢你的关注

出身背景 我正在建造一架四旋翼直升机,在每一个臂上我都放置了一条RGB可寻址LED。我用一个ARDUINO来驱动灯光,而ARDUNO代码是C++,一种我不太熟悉的语言。 我发布了关于我以前遇到的关于此代码的问题的帖子。如果你感兴趣的话,它会给你更多的背景信息,让你知道我到底想做什么

问题 由于我的答案,我现在已经正确地编写了数组gpsHoldArr,但是我在访问它的值时遇到了困难

在下面的代码中,我调用toggleightsgpsholdarr[x][y]并传入gpsHoldArr的子数组。子阵列应该是指向给定LED条[x]然后指向给定步长[y]的结果

然后,toggleLights应该迭代它所传递的数组,并将每个LED的值发送到控制台,该LED的红色、绿色和蓝色值在1-6之间

不幸的是,当我运行下面的代码时,出现了以下错误: 无法将参数1的int*[3]转换为int*“void toggleLightsint*”

任何帮助都将不胜感激

以下是当前代码:
当函数存在时,传递的是一个2D数组,该数组衰减为指针

我可以建议通过创建结构/类来消除数组变暗,这将使内容更加清晰

例如

struct Led{
    int r,g,b;
};

void toggleLights(Led lights[]){

Led gpsHoldArr[4][6][6] = 

set_color_led(i, lights[i].r, lights[i].g, lights[i].b);
这就是您需要做的所有更改,其余的都应该按原样工作


您还可以进一步创建arm结构和step结构。

当函数存在时,您正在传递一个2D数组,该数组衰减为指针

我可以建议通过创建结构/类来消除数组变暗,这将使内容更加清晰

例如

struct Led{
    int r,g,b;
};

void toggleLights(Led lights[]){

Led gpsHoldArr[4][6][6] = 

set_color_led(i, lights[i].r, lights[i].g, lights[i].b);
这就是您需要做的所有更改,其余的都应该按原样工作

您还可以进一步创建arm结构和step结构。

我不认为toggleLights正在做您认为它正在做的事情。它的输入是一个1-D数组,但您正在传递一个大小为[6][3]的2-D数组。当切换LightsGPHoldarr[0][0]时;调用时,函数看到的一维内存数组是{255,0,0,0,0,0},即数组中的前六个值。然后,对于这些值中的每一个,您都调用set_color_led;并为多个参数传递相同的值。在toggleLights中展开循环,这将转换为

// set_color_led(i, lights[i], lights[i], lights[i]) for i = {0, ..., 6}
set_color_led(0, 255, 255, 255);
set_color_led(1, 0, 0, 0);
set_color_led(2, 0, 0, 0);
set_color_led(3, 0, 0, 0);
set_color_led(4, 0, 0, 0);
set_color_led(5, 0, 0, 0);
set_color_led(6, 0, 0, 0); // bug here as noted by molbdnilo
这可能不是你想要的。我会将toggleLights的定义更改为以下内容:

void toggleLights(int lights[][3]){
  for(int i = 0; i < 6; ++i)
  {
    set_color_led(i, lights[i][0], lights[i][1], lights[i][2]);
  } 
}
在toggleLights中展开循环,这将转换为以下一系列函数调用:

// set_color_led(i, lights[i][0], lights[i][1], lights[i][2]) for i = {0, ..., 5}
set_color_led(0, 255, 0, 0);
set_color_led(1, 0, 0, 0);
set_color_led(2, 0, 0, 0);
set_color_led(3, 0, 0, 0);
set_color_led(4, 0, 0, 0);
set_color_led(5, 0, 0, 0);
我不认为toggleLights在做你认为它在做的事情。它的输入是一个1-D数组,但您正在传递一个大小为[6][3]的2-D数组。当切换LightsGPHoldarr[0][0]时;调用时,函数看到的一维内存数组是{255,0,0,0,0,0},即数组中的前六个值。然后,对于这些值中的每一个,您都调用set_color_led;并为多个参数传递相同的值。在toggleLights中展开循环,这将转换为

// set_color_led(i, lights[i], lights[i], lights[i]) for i = {0, ..., 6}
set_color_led(0, 255, 255, 255);
set_color_led(1, 0, 0, 0);
set_color_led(2, 0, 0, 0);
set_color_led(3, 0, 0, 0);
set_color_led(4, 0, 0, 0);
set_color_led(5, 0, 0, 0);
set_color_led(6, 0, 0, 0); // bug here as noted by molbdnilo
这可能不是你想要的。我会将toggleLights的定义更改为以下内容:

void toggleLights(int lights[][3]){
  for(int i = 0; i < 6; ++i)
  {
    set_color_led(i, lights[i][0], lights[i][1], lights[i][2]);
  } 
}
在toggleLights中展开循环,这将转换为以下一系列函数调用:

// set_color_led(i, lights[i][0], lights[i][1], lights[i][2]) for i = {0, ..., 5}
set_color_led(0, 255, 0, 0);
set_color_led(1, 0, 0, 0);
set_color_led(2, 0, 0, 0);
set_color_led(3, 0, 0, 0);
set_color_led(4, 0, 0, 0);
set_color_led(5, 0, 0, 0);

我可能会这样做,去掉一些重复。 宏欺骗仅仅是因为Arduino——在桌面上,我会使用类而不是数组

struct LED { int r, g, b; };

#define BLACK  {0, 0, 0}
#define RED    {255, 0, 0}

#define DEFAULT_LEDS \
  { {RED, BLACK, BLACK, BLACK, BLACK, BLACK},\
    {RED, RED,   BLACK, BLACK, BLACK, BLACK},\
    {RED, RED,   RED,   BLACK, BLACK, BLACK},\
    {RED, RED,   RED,   RED,   BLACK, BLACK},\
    {RED, RED,   RED,   RED,   RED,   BLACK},\
    {RED, RED,   RED,   RED,   RED,   RED}}

LED gpsHoldArr[4][6][6] = {
   DEFAULT_LEDS,
   DEFAULT_LEDS,
   DEFAULT_LEDS,
   DEFAULT_LEDS
};


void set_color_led(int index, const LED& led){
   Serial.println(index); //Which LED (or "pixel") is it?
   Serial.println(led.r); //What is the red value?
   Serial.println(led.g); //What is the green value?
   Serial.println(led.b); //What is the blue value? 
}

void toggleLights(LED (&leds)[6]){
  for(int i = 0; i < 6; ++i)  // You had a '<=' bug here.
  {
    set_color_led(i, leds[i]);
  } 
}

toggleLights(gpsHoldArr[0][0]); //Toggles lights on strip #1, step #1

我可能会这样做,去掉一些重复。 宏欺骗仅仅是因为Arduino——在桌面上,我会使用类而不是数组

struct LED { int r, g, b; };

#define BLACK  {0, 0, 0}
#define RED    {255, 0, 0}

#define DEFAULT_LEDS \
  { {RED, BLACK, BLACK, BLACK, BLACK, BLACK},\
    {RED, RED,   BLACK, BLACK, BLACK, BLACK},\
    {RED, RED,   RED,   BLACK, BLACK, BLACK},\
    {RED, RED,   RED,   RED,   BLACK, BLACK},\
    {RED, RED,   RED,   RED,   RED,   BLACK},\
    {RED, RED,   RED,   RED,   RED,   RED}}

LED gpsHoldArr[4][6][6] = {
   DEFAULT_LEDS,
   DEFAULT_LEDS,
   DEFAULT_LEDS,
   DEFAULT_LEDS
};


void set_color_led(int index, const LED& led){
   Serial.println(index); //Which LED (or "pixel") is it?
   Serial.println(led.r); //What is the red value?
   Serial.println(led.g); //What is the green value?
   Serial.println(led.b); //What is the blue value? 
}

void toggleLights(LED (&leds)[6]){
  for(int i = 0; i < 6; ++i)  // You had a '<=' bug here.
  {
    set_color_led(i, leds[i]);
  } 
}

toggleLights(gpsHoldArr[0][0]); //Toggles lights on strip #1, step #1

谢谢我很感激你的回答,但我不确定如何根据这个答案更正代码。你能告诉我如何正确调用这个函数吗?再次感谢@MatthewPatrickCashatt请查看我的编辑,或者您可以使用错误来确定需要对togglelights函数的签名进行哪些更改..谢谢!我将在几分钟内尝试一下。C++对我来说真的很陌生,所以我非常感谢你的帮助。会让你知道结果的。谢谢!我很感激你的回答,但我不确定如何根据这个答案更正代码。你能告诉我如何正确调用这个函数吗?再次感谢@MatthewPatrickCashatt请查看我的编辑,或者您可以使用错误来确定需要对togglelights函数的签名进行哪些更改..谢谢!我将在几分钟内尝试一下。C++对我来说真的很陌生,所以我非常感谢你的帮助。会让你知道结果的。谢谢!这对于我的特定应用来说是一个很好的方向,但是我有一个问题:从ToGLelLeTeLe中调用StIGoCuLoLoad是错误的:不能将“LED”转换为int,而不是“C++ 2”。我不明白为什么我会犯这个错误
实际上没有int,int在set\u color\u led方法签名中!?谢谢这对于我的特定应用来说是一个很好的方向,但是我有一个问题:从ToGLelLeTeLe中调用StIGoCuLoLoad是错误的:不能将“LED”转换为int,而不是“C++ 2”。我不明白为什么当我在set_color_led方法签名中没有int,int时会出现这个错误!?所有的答案都很有帮助,但这一个是对问题的直接回答,而且很有效。谢谢大家!我很高兴我的回答对你有帮助;听起来是个很酷的项目,祝你好运。我建议您尝试合并molbdnilo的建议,以使代码更具可读性,但在我看来,最好先让代码正常工作,然后在从一个工作修订版到另一个工作修订版的过程中迭代改进。顺便说一句,我在我的桌面上编译/运行了molbdnilo的代码,用iostream替换了您对Serial.println的调用,它在g++4.6.3上运行。我不确定什么地方可能出错,但请确保您准确地复制了它。所有的答案都非常有用,但这一个是对问题的直接回答,并且有效。谢谢大家!我很高兴我的回答对你有帮助;听起来是个很酷的项目,祝你好运。我建议您尝试合并molbdnilo的建议,以使代码更具可读性,但在我看来,最好先让代码正常工作,然后在从一个工作修订版到另一个工作修订版的过程中迭代改进。顺便说一句,我在我的桌面上编译/运行了molbdnilo的代码,用iostream替换了您对Serial.println的调用,它在g++4.6.3上运行。我不确定什么地方可能出错,但请确保您准确地复制了它。