2009-08-30 2 views
1

숫자 값을 일정량 늘리거나 줄여 픽셀 값 (채널당 RGBA 8 비트)을 수정하려고합니다. Objective-C 또는 C에서이 작업을 수행하려면 어떻게해야합니까? 다음 코드는 매번 "오류 : EXC_BAD_ACCESS"을 생성합니다.부호없는 문자를 늘리거나 줄이는 방법은 무엇입니까?

// Try to Increase RED by 50 
    for(int i = 0; i < myLength; i += 4) { 

     //NSLog prints the values FINE as integers 
      NSLog(@"(%i/%i/%i)", rawData[i], rawData[i+1], rawData[i+2]); 

      //But for some reason I cannot do this 
     rawData[i]+=50; 

} 

심지어

// Try to set RED to 50 
    for(int i = 0; i < myLength; i += 4) { 

      //I cannot even do this... 
     unsigned char newVal = 50; 
     rawData[i] = 50; 

} 

(!) 참고 : RAWDATA는 rawdata 뭐죠 ... 유형 서명 숯불

+0

이것은 컴파일 타임 오류입니까 아니면 런타임 오류입니까? –

+1

Objective-C 또는 C를 묻는 질문에 "C++"태그가 붙은 이유는 무엇입니까? – mmmmmmmm

+0

내가 0xC0DEFACE

답변

4

할당 된 버퍼의 끝을 초과하는 것이므로 액세스 위반이 발생합니다. 이것은 대개 할당이 잘못되었거나 rawData 포인터의 유형이 잘못되었음을 의미합니다.

로드 된 UIImage의 원시 데이터에 액세스하는 경우 메모리가 읽기 전용으로 매핑 될 수 있습니다. 데이터를 할당 한 버퍼에 복사해야 할 가능성이 높습니다.

+0

예, 버퍼의 끝에서 오버런했습니다. - 감사합니다! BTW, buffer rawData가 * rawData = malloc (height * width * 4);로 정의 된 경우 버퍼의 끝을 테스트하는 좋은 방법을 알고 있습니까? – RexOnRoids

+1

나는 당신이 쓰고있는 곳을 추적하는 것 외에 다른 좋은 시험이 있다고 생각하지 않는다. is not myLength = height * width * 4. BTW, 특정 바이트 경계에 맞추기 위해 각 행의 끝 부분에 여분의 패딩 바이트가있을 수 있습니다. rowBytes 값을 가진 경우 너비와 함께 사용하여 패딩을 칠 때를 알 수 있습니다. – mahboudz

+0

버퍼 오버런은 런타임에 의심되는 경우이를 감지 할 수 있습니다. 터미널 창에서 "man malloc"은 사용 가능한 디버깅 기능에 대한 자세한 정보를 제공합니다. 반면에 EXC_BAD_ACCESS는 버퍼 오버런에 대한 강력한 지표입니다. –

0

흠의 데이터 버퍼입니까? 어쩌면 수정할 수없는 const 유형일까요?

+0

rawData는 unsigned char 유형입니다. unsigned char as : * rawData = malloc (height * width * 4); – RexOnRoids

관련 문제