2012-12-13 2 views
1

나는 코드목표 - C 경고, 선언되지 않은 식별자를 사용하는 '새로운'

Byte* decompressedBytes = new Byte[COMPRESSION_BLOCK]; 

이을의이 라인에이 오류를 '새로운'

선언되지 않은 식별자의

사용을 얻고있다 이 코드 줄이 나타나는 내 방법입니다.

// Returns the decompressed version if the zlib compressed input data or nil if there was an error 
+ (NSData*) dataByDecompressingData:(NSData*)data{ 
    Byte* bytes = (Byte*)[data bytes]; 
    NSInteger len = [data length]; 
    NSMutableData *decompressedData = [[NSMutableData alloc] initWithCapacity:COMPRESSION_BLOCK]; 
    Byte* decompressedBytes = new Byte[COMPRESSION_BLOCK]; 

    z_stream stream; 
    int err; 
    stream.zalloc = (alloc_func)0; 
    stream.zfree = (free_func)0; 
    stream.opaque = (voidpf)0; 

    stream.next_in = bytes; 
    err = inflateInit(&stream); 
    CHECK_ERR(err, @"inflateInit"); 

    while (true) { 
     stream.avail_in = len - stream.total_in; 
     stream.next_out = decompressedBytes; 
     stream.avail_out = COMPRESSION_BLOCK; 
     err = inflate(&stream, Z_NO_FLUSH); 
     [decompressedData appendBytes:decompressedBytes length:(stream.total_out-[decompressedData length])]; 
     if(err == Z_STREAM_END) 
      break; 
     CHECK_ERR(err, @"inflate"); 
    } 

    err = inflateEnd(&stream); 
    CHECK_ERR(err, @"inflateEnd"); 

    delete[] decompressedBytes; 
    return decompressedData; 
} 

이것이 왜 이렇게 나타나는지 확신 할 수 없습니다. 이 코드는 ObjectiveZlib에서 왔으며 여러 번 읽었고 zlib NSData 객체의 압축을 풀기 위해 내 자신의 코드에서 사용하지 않으려 고하지만이 작업을 진행하는 것을 막을 수 있습니다.

모든 도움을 주시면 대단히 감사하겠습니다.

+0

이 방법이 작동 했습니까? 파일이 zip 형식 –

답변

5

이 코드는 Objective-C++입니다. Objective-C로 컴파일하려고합니다. 파일의 이름을 .m 대신 .mm으로 끝내면 올바르게 작동합니다.

특히 newdelete 연산자는 C++ 연산자입니다. Objective-C는 C의 상위 집합이며 Objective-C++는 C++의 상위 집합입니다. (Byte*)malloc(sizeof(Byte) * COMPRESSION_BLOCK)

  • delete[] decompressedBytes 교체와 new Byte[COMPRESSION_BLOCK] 교체

    1. : - 그 유일한 C++로 표시하기 때문에 오히려 오브젝티브 C를 고수하려는 경우,이 코드의 ISMS를, 당신은 두 줄을 교체하여 문제를 해결할 수 있습니다 free(decompressedBytes)
  • +0

    ahHA로 변환 되었습니까? 나는 .mm이 예제 파일에서 오류라고 생각했다. ... 대단히 감사합니다. 어떻게 내 .m 파일 중 하나에서이 메소드 중 하나를 호출 할 수 있습니까? 메소드가 로컬 사용을 위해 +로 선언 되었기 때문에 그렇지 않습니까? – HurkNburkS

    +0

    오 고맙습니다. 지금 새 제안을 시도해 주셔서 감사합니다. – HurkNburkS

    +0

    @HurkNburkS :'+'는 지역에서 사용하는 것이 아닙니다. 그것은 클래스 메소드를 의미합니다. 따라서이 코드를'.mm' 파일에 남겨두면'[NSData dataByDecompressingData : someData]'로 호출 할 수 있습니다. '#import "NSData + zlib.h를 가지고 있는지 확인하십시오. –

    1

    new은 Objective-C가 아닌 C++ 구조체입니다. 위의 코드에서 아마 그것을 위해 NSMutableData을 사용하는 것입니다

    Byte* decompressedBytes = (Byte*) malloc(COMPRESSION_BLOCK); 
    

    과 동일하게 delete[] ... 라인이 솔루션처럼

    free(decompressedBytes); 
    

    더 오브젝티브 C로 대체되어야한다을 읽어야 할 사람 :

    Byte *decompressedBytes = (Byte*) 
        [[NSMutableData dataWithLength: COMPRESSION_BLOCK] mutableBytes]; 
    

    이 경우에는 해당 버전을 출시 할 필요가 없습니다 (또는 [[NSMutableData alloc] initWithLength:...] 및 위 버전의 출시 버전).

    +0

    안녕하세요, 도움 주셔서 감사합니다.이 코드는 아무런 경고 메시지없이 작동합니다. ! 내가 먹이를 먹는 데이터에 오류가 발생했습니다. 로그 ** 오류가 팽창합니다 : -3 ** ** CHECK_ERR (오류, @ "팽창"); ** if (오류 == Z_STREAM_END) statment면?이 문제를 일으키는 원인은 무엇이라고 생각하십니까? 데이터 불량입니까? – HurkNburkS

    +0

    실제로받는 패킷의 헤더가 압축되지 않아 압축을 방해하고 있습니다. 지금 .. 고마워. 고마워. – HurkNburkS

    관련 문제