这里有很多这样的问题,我不能很好地指出这一点 - 我希望得到一个更明确的答案(例如。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, ¢reSequence};
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);
}
答案 0 :(得分:2)
seq_t[2][8][10]
是一个3D数组。这意味着seq_t是指向typdef signed char
指针的指针。 seq_t
指向名为seq_t[2]
的指针数组的第一个位置(一个包含2个指针的数组)。
举一个简单的例子,看看这张图片:
它是关于一个名为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[] = {¢reSequence,&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");
}
}