2012-01-27 3 views
0

대기열 (CHCircularBufferQueue)에 일련의 char * 객체를 추가하는 데 문제가 있습니다. Queue는 객체를 입력으로 받아들입니다 (이해하는 한). 따라서 간단하게 char * tokenName을 포함하는 tokenObject라는 NSObject에서 상속받은 간단한 객체를 생성했습니다. Queue에 새로운 tokenObject를 추가 할 때마다 새로운 tokenObject를 할당 한 다음 Queue에 다음 번에 추가 할 때 Queue에 새로운 tokenObject를 전달합니다. 그러나 tokenObject.tokenName을 새로운 char * 문자열로 설정하면 Queue의 모든 tokenObject가 무시되므로 전체 Queue를 인쇄 할 때 고유 한 문자열 대신 동일한 문자열이 연속으로 나타납니다. 내가 뭘 잘못하고 있니? 개체를 큐 또는 스택에 추가 할 때마다 개체의 새 인스턴스를 만들어야합니까? Objective-C

목표 -C 이하

main.m &에서 코드 tokenObject.h 하다에 main.m :

int main (int argc, const char * argv[]) 
{ 
    CHCircularBufferQueue *tokenQueue = [[CHCircularBufferQueue alloc] init]; 
    tokenObject *myTokenObject = [[tokenObject alloc] init]; 


TK currentToken; 
initScanner(); 
scanToken(); 
[myTokenObject setTokenName:getToken() ]; 
currentToken = getTkrep(); 

int x=0; 

while (x<5/*currentToken != TK_EOF*/) { 


     //printf("line number: %d, token value: %d, token string: %s\n", getLinenumber(), getTkrep(), getToken()); /* replace line with "add to queue" */ 
    scanToken(); 
    myTokenObject.tokenName = getToken(); 
    [tokenQueue addObject:myTokenObject]; 
    myTokenObject = [[tokenObject alloc] init]; 
    currentToken = getTkrep(); 


    x = x+1; 
} 

while(x != 1){ 
    printf("%s", [[tokenQueue firstObject] tokenName]); 
    [tokenQueue removeFirstObject]; 
    x = x-1; 

    printf("%i", x); 
} 
return 0; 

}

tokenObject.h :

@interface tokenObject : NSObject{ 

    char *tokenName; 
} 
@property (assign) char* tokenName; 

@end

+0

무언가를 추가 할 때마다 새 개체를 만들 필요는 없지만 사용자 지정 개체에 tokenName 포인터가 하나만 있기 때문에 고유 한 개체가 필요합니다. (왜 NSString 객체를 추가하지 않을까요?) –

+0

'getToken'은 정확히 무엇을할까요? 해제를 담당하는 새로 할당 된 문자열을 반환합니까? 아니면 내부적으로 유지하고 수정할 수있는 것입니까? 즉, NSString을 왜 사용하지 않는지에 대한 두 번째 Licks의 질문도 있습니다. – nil

+0

나는 서브 클래 싱하는 대신 NSString을 구현하려고 시도하고 있는데, 정확히 구현할 수 있을까요? getToken()은 char *를 반환하고 교수가 제공 했으므로 코드의 해당 부분을 수정할 수 없습니다. NSString에 대한 setter 함수는 무엇입니까? – kabirpong

답변

0

샘플은 몇 가지 방법으로 코코아 모범 사례에 반대합니다. 한 가지 방법은 일반적으로 main.m이 아닌 응용 프로그램의 대리인에서 기능을 시작하는 것입니다.

그러나 질문에 대한 답변으로 char * 대신 NSString *을 사용해보십시오. 사용자 지정 TokenObject가 문자열을 보유하는 것 외에 다른 작업을 수행합니까? 그렇다면 모두 서브 클래 싱을 피하고 NSString을 직접 할당하거나 할당하고 큐에 추가하십시오. 결과를 기대 이상으로 찾아야합니다.

+1

그는 사용자 인터페이스가있는 명령 줄 응용 프로그램이 아니라 명령 줄 응용 프로그램을 만들고 있다고 생각합니다. 따라서 응용 프로그램 대리인이 필요하지 않습니다. – dreamlax

+0

의견을 보내 주셔서 감사 드리며, 지금 바로 시도하겠습니다. 코코아 프랙티스에 관해서, 정확히 어디에서 코드를 시작할 수 있습니까? objective-c 클래스 용 명령 줄 구문 분석 도구를 만들고 있습니다. 그게 내 프로젝트에 적용됩니까? (나는 객관적인 C를 처음으로 배우기 때문에 내 질문이 어리석은 일이라면 실례합니다.) – kabirpong

+0

문제는 어리석은 짓은 아니지만 우리는 모두 어딘가에서 시작합니다. 명령 줄 도구를 만드는 경우 main.m은 실제로 문제가 없습니다. – isaac

0

예. 대기열의 각 구성원은 고유 한 객체를 보유해야합니다. 그렇지 않으면 동일한 객체로 큐를 반복해서로드합니다. 따라서 언제든지 myTokenObject.tokenName = getToken();을 수행하면 전체 대기열에있는 모든 토큰을 덮어 씁니다. 대기열의 각 위치에 대해 고유 한 객체를 만드는 경우 각 객체는 고유 한 토큰을 보유합니다.

+0

코드를 보면 각 토큰에 대해 새 개체를 할당하고 있습니다. 따라서 그는 대기열에있는 모든 토큰을 수정하지는 않습니다. 'getToken' 메서드가 각 토큰에 대해 수정하는 일부 버퍼에 주소를 반환 할 가능성이 높습니다. – nil

관련 문제