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