2014-06-20 5 views
0

우리는 다음과 같은 두 가지 정적으로 정의 바이트 배열을 가지고 ...C에서 변수에 다차원 배열을 저장하는 방법은 무엇입니까?

unsigned char pixelBuffer1[32][6] = {/**/}; 
unsigned char pixelBuffer2[32][6] = {/**/}; 

우리는 변수에 현재의 버퍼를 저장할하지만 우리는 그것을 선언하는 방법을 확실하지 않다. 이것은 우리가 내가 알고 [SOMETYPE]

에 입력해야할지 확실하지 않다,

[SOMETYPE] activePixelBuffer; 

activeBufferId == getOneOrTwoBasedOnSomeLogic(); 
activePixelBuffer = (activeBufferId == 1) 
    ? pixelBuffer1 
    : pixelBuffer2; 

activePixelBuffer[17][4] = x; 

activeBufferId == getOneOrTwoBasedOnSomeLogic(); 
activePixelBuffer = (activeBufferId == 1) 
    ? pixelBuffer1 
    : pixelBuffer2; 

activePixelBuffer[23][2] = y; 

그러나 을 (우리가 코드에 걸쳐 activePixelBuffer의 가치를 재 할당하는 참고) ... 우리가 원하는 것입니다 우리가 함수에 pixelBuffer1 또는 pixelBuffer2을 통과하고, 우리는 ... 이런 식으로

void someFunc(unsigned char (&myArray)[32][6]) 
{ 
    ... 
} 

그것을 정의하는 것입니다 ...하지만 로컬 변수 선언 형식으로 작동하지 않습니다. 또한, 이는 우리가 괜찮은 차원 크기를 하드 코딩하도록 강요하지만, 그렇게하지 않는 것이 좋을 것입니다.

우리는 또한 포인터를 사용해 보았지만 배열의 2 차원 적 측면은 우리를 너무 멀리 던졌습니다.

그래서 우리는 유형에 무엇을 사용합니까?

+1

'unsigned char ** myArray'가 작동해야합니다. –

+3

'typedef '를 사용하십시오. 이렇게하면 이런 일들이 훨씬 쉬워집니다. –

+3

@LeventeKurusa : 아니요. 실제로 작동하지 않습니다.'char **'는'char [] []'과 동일하지 않습니다. –

답변

7

사용하십시오 typedef :

typedef unsigned char PixelBuffer[32][6];  // NB: SPOT principle, aka DRY! 

PixelBuffer pixelBuffer1 = { ... }; 
PixelBuffer pixelBuffer2 = { ... }; 
PixelBuffer *activePixelBuffer = (activeBufferId == 1) ? &pixelBuffer1 : 
                 &pixelBuffer2; 

(*activePixelBuffer)[17][4] = x; 

뿐만 아니라 구문을 만들기로이 또한 원리 SPOT (진실의 단일 포인트)의 예이다 청소기 많은, 일명 DRY (자신을 반복하지 마십시오 것을) - 2D 배열 유형은 한 번만 정의해야합니다. 복사 및 붙여 넣기는 unsigned char foo[32][6]! 배열에

+0

첫 번째 라인의 의미에 대한 의견은 무엇입니까? (예 : NB : SPOT 등) 그리고 PixelBuffer뿐 아니라 PixelBuffer1도 설치해야합니까? – MarqueIV

+0

또한 (C/C++을 처음 사용하는)하지만 치수가없는 배열을 참조하면 주소 (&) 연산자가 필요하지 않으므로 어쨌든 다시 가져온 것입니다. ... 또는 배열 자체를 가리키는 변수가 아니라 배열 자체의 주소를 원한다고 말하고 있습니까? (나는 그 후자를 느낀다) – MarqueIV

+0

@ MarqueIV : "* 그리고 PixelBuffer1을 가지고 있니?* "폴 R *은 ​​악명 높은 복사/붙여 넣기 프로그래밍 습관을 우연히 발견했습니다 ... ;-) 수정되었습니다 – alk

1

참조는 C++로 작동합니다

C에서
int activeBufferId = 1; 
unsigned char pixelBuffer1[32][6] = {/**/}; 
unsigned char pixelBuffer2[32][6] = {/**/}; 
unsigned char (&activePixelBuffer)[32][6] = (activeBufferId == 1) ? pixelBuffer1 : pixelBuffer2; 

activePixelBuffer[17][4] = '*'; 

, 당신은 포인터를 사용해야합니다 : 문법과 가독성을 쉽게하기 위해, 어쨌든

unsigned char (*activePixelBuffer)[32][6] = (activeBufferId == 1) ? &pixelBuffer1 : &pixelBuffer2; 

(*activePixelBuffer)[17][4] = '*'; 
activePixelBuffer = &pixelBuffer2; // reassign the pointer to point to the other C-array. 

을,이 배열을 이동하는 것이 좋습니다 struct/class이므로 참조/포인터를 클래스에 사용해야합니다.

typedef struct PixelData { unsigned char buffer[32][6] } PixelData; 

PixelData pixelData1 = {/**/}; 
PixelData pixelData2 = {/**/}; 
PixelData *activePixelData = (activeBufferId == 1) ? &pixelData1 : &pixelData2; 
+0

그래,하지만 C++ 응답에서 어떻게 * activePixelBuffer를 나중에 다시 할당 할 수 있습니까? (나는 내 ​​질문을 업데이트하고 있습니다. 'after after.) – MarqueIV

+0

참조로 * ref를 재 할당 할 수 없습니다. erence (다른 변수를 가리 키기 위해). 다른 변수를 가리킬 수있게하려면 포인터를 사용해야합니다. – Jarod42

+0

포인터를 사용하여 재 할당 버전을 보여줄 수 있습니까? – MarqueIV

관련 문제