取消引用数组数组的元素

时间:2014-01-07 05:27:28

标签: c arrays

这里有很多这样的问题,我不能很好地指出这一点 - 我希望得到一个更明确的答案(例如。Array of pointers to arrays很接近,我就是无法做到使用typedef)。

此代码为一组LED定义了一组动画序列。要输出的值是根据序列,硬件模型和序列中的阶段来选择的。我很想重复每个序列的for循环,但我可能会再次使用它,也可能在这里学到一些东西。

基于打印值,我得不到我期望的*(序列[模式])[模型] [prevstage] [ix]。我错过了什么?

void sequence(unsigned char reset, t_mode mode, unsigned char delaydiv4)
{
  typedef signed char seq_t[2][8][10];

  const seq_t centreSequence = {
    {
      {ZERO_LEFT_2, ZERO_RIGHT_2, -1},
.
      {-1},
    },
    {
      {ONE_LEFT_2, ONE_RIGHT_2, -1},
.
      {-1},
    },
  };
  const seq_t leftSequence  = {
    {
      {ZERO_RIGHT_2, -1},
.
      {ZERO_LEFT_TOP, ZERO_LEFT_BOT, -1},
    },
    {
      {ONE_RIGHT_2, -1},
.

      {ONE_LEFT_TOP, ONE_LEFT_BOT, -1},
    },
  };
  const seq_t rightSequence = {
    {
      {ZERO_RIGHT_2, -1},
.
.
      {ZERO_LEFT_TOP, ZERO_LEFT_BOT, -1},
    },
    {
      {ONE_RIGHT_2, -1},
.
.

      {ONE_LEFT_TOP, ONE_LEFT_BOT, -1},
    },
  };

  const seq_t* sequences[] = {&leftSequence, &rightSequence, &centreSequence};

  static unsigned char stage;
  static unsigned char prevstage; 
  const unsigned char model = 0;
  if (reset != 0)
    {
      stage = 1;
      prevstage = 0; 
    }

  for (unsigned ix=0; sequences[mode][model][prevstage][ix] != -1; ++ix)
    {
      digitalWrite(*(sequences[mode])[model][prevstage][ix], 0);
    }

2 个答案:

答案 0 :(得分:2)

seq_t[2][8][10]是一个3D数组。这意味着seq_t是指向typdef signed char指针的指针。 seq_t指向名为seq_t[2]的指针数组的第一个位置(一个包含2个指针的数组)。

举一个简单的例子,看看这张图片:

enter image description here

它是关于一个名为nums[5][4]的2D数组,其中nums[2]是指向每个红色数组的第一个位置的指针数组,nums是指向int的指针(或任何nums[5][4] 1}}是...)

问题中的

&leftSequence是指向leftSequence的指针。 leftSequence本身是一个指向指向char的指针的指针,所以你只需要构建一个指针指向指向char的指针的指针!!!!!

你真的想用它做什么?!!


我想完成我的回答。

在您编写的代码中

sequences[mode][model][prevstage][ix]   //in the while

和:

*(sequences[mode])[model][prevstage][ix]   //in digitalWrite

两者都不正确。 *是一个非常低优先级的运算符,所以你的第二个代码就像:

*(sequences[mode][model][prevstage][ix])

正如我所说的,[mode]是一个指向你的三种模式而不是其中一种模式的指针。

您可以使用()和*来修复它们:

(*sequences[mode])[model][prevstage][ix]  

并且最后......你使用了额外的指针。这更简单:

  const seq_t* sequences[] = {leftSequence, rightSequence, centreSequence};

  sequences[mode][model][prevstage][ix] != -1               //in the while

  digitalWrite(sequences[mode][model][prevstage][ix], 0);   //digitalWrite

BTW我对数字写功能不太了解,所以也许你需要另外一个*那里......

我想我完全解释了......

答案 1 :(得分:1)

我已经测试了你的代码一个下午(我是C的新手),你可以得到你想要的改变

*(sequences[mode])[model][prevstage][ix]

(*sequences[mode])[model][prevstage][ix]

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

typedef int seq_t[2][2][3];

const seq_t centreSequence = {
    {
      {1,2,3},
      {4,5,6},
    },
    {
      {7,8,9},
      {10,11,12},
    }
};

const seq_t leftSequence  = {
    {
      {13,14,15},
      {16,17,18},
    },
    {
      {19,20,21},
      {22,23,24},
    }
};

const seq_t rightSequence = {
    {
        {25,26,27},
        {28,29,30},
    },
    {
        {31,32,33},
        {34,35,36},
    }
};

int main(void)
{
    int j  = 0 , i1 = 0 , i2  = 0 , i3 = 0 ;

    const seq_t* sequences[] = {&centreSequence,&leftSequence, &rightSequence };

    for( j = 0 ; j < 3 ; j++ )
    {
        for( i1 = 0 ; i1 < 2 ; i1++ )
        {
            for( i2 = 0 ; i2 < 2 ; i2++ )
            {
                for( i3 = 0 ; i3 < 3 ; i3++ )
                {
                    printf("%d ",(*sequences[j])[i1][i2][i3]);
                }
                printf("\n");
            }
            printf("\n");
        }
        printf("\n");
    }
}