2014-01-07 62 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