【问题标题】:Why do I get weird integers when looping through an array为什么在遍历数组时会得到奇怪的整数
【发布时间】:2016-02-09 22:26:25
【问题描述】:

这是我的 C++ 代码,用于循环并在最后打印出结构的属性。

#include <iostream>

typedef struct
{
   int red;
   int green;
   int blue;
} card_t;

int main()
{
   int colorPalette[][3] =
   {
      { 168,   0,  32 },
      { 228,  92,  16 },
      { 248, 216, 120 },
      {  88, 216,  84 },
      {   0, 120, 248 },
      { 104,  68, 252 },
      { 216,   0, 204 },
      { 248, 120, 248 }
   };
   int colorCount = (sizeof(colorPalette) / sizeof(*colorPalette));

   int    deckSize = colorCount * 2;
   card_t deck[deckSize];

   for (int i = 0; i < 2; i++)
   {
      for (int x = 0; x < colorCount; x++)
      {
         int    red   = colorPalette[x][0];
         int    green = colorPalette[x][1];
         int    blue  = colorPalette[x][2];
         card_t card  = { red, green, blue };
         deck[i + 1] = card;

         std::cout << card.red << ' ' << card.green << ' ' << card.blue <<
            std::endl;
         std::cout << "======" << std::endl;
      }
   }

   for (int i = 0; i < deckSize; i++)
   {
      std::cout << deck[i].red << ' ' << deck[i].green << ' ' << deck[i].blue
                << std::endl;
   }

   return 0;
}

当我 cout 第一个循环块中的值时,结果很好,但在最后一个,我得到:

-1665734512 32653 -1651136112
248 120 248
248 120 248
0 -1653342144 32653
-1653436608 32653 -1656110705
32653 -1653337504 32653
1116561856 32767 -1653337504
32653 6 0
6 16 6296320
0 0 0
1116562424 32767 1116562408
32767 1 0
1116562096 32767 -1653270346
32653 1 32653
0 0 -1653444720
32653 -1665734512 32653

这是怎么回事?

【问题讨论】:

  • 为什么每次通过内部循环都覆盖deck[i+1]?完成后,它将始终包含来自colorPalette[colorCount-1] 的值,那么循环的目的是什么?

标签: c++ arrays loops integer


【解决方案1】:

这似乎是由于对 deck 数组的错误迭代:

for(int i=0; i<2; i++){
    for(int x=0; x<colorCount; x++){
        int red=        colorPalette[x][0];
        int green=      colorPalette[x][1];
        int blue=       colorPalette[x][2];
        card_t card=    {red, green, blue};
        deck[i*colorCount + x]=      card;
//           ^^^^^^^^^^^^^^^^
        /* ... */
    }
}

您似乎打算做的是使用一维数组表示一个二维数组,可以如上所示完成。

【讨论】:

    【解决方案2】:

    我假设deck 将被colorPalette[] 填充两次,因此deckSize = colorCount*2;

    在第一个循环中,您正在填写deck 中的值,您正在从本地card 变量打印到屏幕,而不是从存储在deck 中的值。请参阅std::cout&lt;&lt;card.red&lt;&lt; (...),您正在使用局部变量。

    至于为什么第二个循环的值是错误的,是因为你存储错误;索引是错误的。您想在 [0, deckSize-1] 范围内迭代 deck,但在第一个和第二个外循环上,i+1 将分别为 1 和 2。因此,您继续覆盖甲板 [1] 和甲板 [2]。这就是为什么打印的第二个和第三个值是“248 120 248”,这是最后一个要写入的值。其他数字只是随机的、未初始化的内存空间。

    deck[(i*colorCount) + x]= card; 按我的想法工作。

    此外,这看起来更像是 C 代码而不是 C++。您可以使用 std::vector、迭代器和 C++ 结构。

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      相关资源
      最近更新 更多