2014-01-07 2 views
1

여기에 많은 질문이 있습니다. 이걸 제대로 처리 할 수는 없지만 - 더 명확한 대답을 원합니다 (예 : 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, &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_tseq_t[2] (2 포인터의 배열)이라는 포인터 배열의 첫 번째 위치를 가리 킵니다. enter image description here

nums[2] 각 붉은 배열의 및 nums의 첫 번째 장소에 대한 포인터의 배열 인 nums[5][4]라는 이름의 2 차원 배열에 대한 포인터가 있습니다 : 간단한 예를 들어

는이 그림을 보면 int에 대한 포인터 (또는 무엇이든 nums[5][4] ...)

질문에 &leftSequenceleftSequence에 대한 포인터입니다. leftSequence 자체는 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