C 取消对数组数组元素的引用

C 取消对数组数组元素的引用,c,arrays,C,Arrays,这里有一大堆这样的问题,我不能很好地找到正确的答案-我希望有一个更清晰的答案(例如,很接近,我就是不能让它与typedef一起工作) 此代码为一组LED定义一组动画序列。根据序列、硬件型号和序列中的阶段选择要输出的值。我很想为每个序列重复for循环,但我可能会再次使用它,并可能在这里学到一些东西 基于打印的值,我没有从*(序列[mode])[model][prevstage][ix]中得到我期望的结果。我错过了什么 void sequence(unsigned char reset, t_mod

这里有一大堆这样的问题,我不能很好地找到正确的答案-我希望有一个更清晰的答案(例如,很接近,我就是不能让它与typedef一起工作)

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

基于打印的值,我没有从*(序列[mode])[model][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][8][10]
是一个3D阵列。这意味着seq_t是指向指向
typdef signed char
的指针的指针
seq_t
指向名为
seq_t[2]
的指针数组(由两个指针组成的数组)的第一个位置

举个简单的例子,请看下图:

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

在您的问题
&leftSequence
中,是指向
leftSequence
的指针。
leftSequence
本身就是指向char指针的指针,所以您只需构建指向char指针的指针

你到底想用它做什么


我想完成我的回答

您在代码中编写了:

sequences[mode][model][prevstage][ix]   //in the while
以及:

两者都不正确。*是一个非常低优先级的操作员,因此您的第二个代码与以下代码完全相同:

*(sequences[mode][model][prevstage][ix])
正如我所说的序列[模式]是指向三种模式之一的指针,而不是其中之一

您可以使用()和*来修复这两个问题:

(*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
顺便说一句,我不太了解digitalwrite函数,所以也许你需要另一个


我想我已经完全解释清楚了

我已经测试了您的代码一个下午了(我是C新手),如果您进行更改,您可以得到您想要的

*(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");
    }
}
#包括
#包括
typedef int seq_t[2][2][3];
常数序列中心序列={
{
{1,2,3},
{4,5,6},
},
{
{7,8,9},
{10,11,12},
}
};
常数序列左序列={
{
{13,14,15},
{16,17,18},
},
{
{19,20,21},
{22,23,24},
}
};
常数序列右序列={
{
{25,26,27},
{28,29,30},
},
{
{31,32,33},
{34,35,36},
}
};
内部主(空)
{
int j=0,i1=0,i2=0,i3=0;
const seq_t*序列[]={¢reSequence,&leftSequence,&rightSequence};
对于(j=0;j<3;j++)
{
对于(i1=0;i1<2;i1++)
{
对于(i2=0;i2<2;i2++)
{
对于(i3=0;i3<3;i3++)
{
printf(“%d”,(*序列[j])[i1][i2][i3]);
}
printf(“\n”);
}
printf(“\n”);
}
printf(“\n”);
}
}

@GrijeshChauhan paint:D快速免费变化!!太棒了,非常感谢。因此,这是一个简单的优先权在最后,非常感谢花时间作出这样一个完整的答案。顺便说一句,你不能放弃对数组元素初始化器的尊重,我得到了
traffic\u arrow.ino:125:错误:无法在初始化中将'const signed char(*)[9][10]'转换为'const signed char(*)[2][9][10]。
顺便说一句,我真的不太了解数码写入功能。也许你还需要一个,谢谢你花时间来帮助我,很抱歉其他人更快了。
(*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");
    }
}