2014-01-07 63 views
1

这里有一堆这样的问题,我不能很好的指出这个问题 - 我希望得到一个更清晰的答案(例如,Array of pointers to arrays很接近,我可以'使它与typedef一起工作)。解引用阵列数组的元素

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

基于打印值,我没有得到我期望的*(序列[模式])[模型] [前期] [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

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]是...)

在你的问题&leftSequence是一个指针leftSequenceleftSequence本身是一个指向指向char的指针的指针,所以你只需构建一个指向指向char的指针的指针的指针!!!!!

你真的想用这个做什么?


我想完成我的答案。

在你的代码

你写道:

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

和:

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

都是不正确。 *是一个非常低优先级的操作让你的第二个代码是完全一样:

*(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 

BTW,我不知道很多关于digitalwrite功能,所以也许你需要另一个*有...

我想我完全解释它...

+0

好图......你正在使用的工具。 –

+1

@GrijeshChauhan油漆:D变化快,免费! – amfad33

+4

*非常不同! :| – amfad33

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"); 
    } 
} 
+0

感谢您花时间帮助我,对不起,别人更快。 – TomKeddie