2011-05-11 2 views
2

비디오 처리 프로젝트를하고 있는데, dct 함수로 보내기위한 블록 주소를 지정하는 것이 좋습니다.다른 로컬 포인터에 포인터가 가리키는 주소를 할당하는 방법

다음 줄은 올바른 할당 주소를 가리키는 오른쪽 변수로 사용하지 않습니다.

temp = (unsigned short *)((unsigned short *)(p_vqi->luma + j) + l); 

정도로 tempi는 각각 144과 176의 각 단계에 대한 최대 16 배 증가한다 jp_vqi->luma 변수 가리키는 올바른 어드레스를 포함하지 않는다.

+3

를 선언? 그 뒤에있는 데이터 조직은 무엇입니까? – sharptooth

답변

2

자주 포인터 연산을하는 사람은 한 번에 1 바이트를 추가하지 않는다는 점을 고려하면 한 번에 sizeof(thing pointed to)을 하나 추가하므로 j 루마를 건너 뛸 수 있습니다. i 서명되지 않은 반바지지만 아키텍처에 큰 영향을줍니다.

uint8_t* temp = (uint8_t*)p_vqi->luma; 
temp += j*16 + i; 
2

포인터에 번호를 추가하는 요소가 아닌 바이트의 번호로 포인터를 증가주의하십시오 :처럼 바이트 바로 일을 고정 형식으로 작업 할 때 일반적으로, 그것은 더 쉽고 휴대용입니다. 즉, 먼저 j * sizeof(the type of the luma entries)을 포인터에 추가 한 다음 i * sizeof(unsigned short)인데, 대부분의 구현에서 2 바이트입니다.

그러나 j + i 바이트를 추가하려면 다음과 같이해야합니다.

temp = (unsigned short *)((intptr_t)p_vqi->luma + j + i); 

원본의 i + j 바이트를 앞당기 고있는 부호없는 short에 대한 포인터를 제공해야합니다. intptr_t 유형은 C99입니다. 이전 컴파일러와 호환되어야 할 경우 unsigned long을 대신 사용하십시오.

+0

감사합니다. Harald 씨가 직접하되 경고로 경고합니다. C4047 : '=': 'unsigned short **'는 간접적 인 수준이 'unsigned short *'와 다릅니다. – Arun

+0

직접 다른 명령을 시도했지만 잘 모릅니다. 그 코드의 중간에 여전히 나와 같거나 옳지 않습니다. – Arun

+0

임시 직원은 어떻게 선언됩니까? – harald

1

포인터의 추가 (& 빼기)는 표준 산술 연산과 다른 동작을합니다. 이러한 작업은 자신이 나타내는 데이터의 크기에 따라 인수 분해됩니다.

두 바이트 짧은 문자가 1 바이트 점을 고려, 예를 취할 수 있습니다와의 int는 4 바이트 길이 : 어떻게`luma`이

char * p1; 
shot * p2; 
int * p3; 

p1 += 1; // p1 will be incremented by 1 
p2 += 1; // p2 will be incremented by 2 
p3 += 1; // p3 will be incremented by 4 
관련 문제