2014-03-13 5 views
0

TDD를 수행 할 때 몇 가지 문제가 발생했습니다. 전역 변수를 두 번 할당 할 수 없습니다.

typedef struct { 
    char *rawString; 
    int startIndex; 
    int length; 
} String; 

나는이 getWordAndUpdate 전화

가 잘 작동 처음 작동,하지만 난 두 번 호출 할 때 나쁜 메모리 액세스를 말한다 : 내 문자열 구조체로

String *subString; 

String *getWordAndUpdate(String *line, char *delimiter) { 
    String *word = malloc(sizeof(String)); 
    int i; 

    stringLeftTrim(line); 

    word->length = 0; 
    word->startIndex = 0; 

    for(i = line->startIndex; i < line->length; i++) { 
     if(line->rawString[i] != ' ') { 
      word->rawString[i] = line->rawString[i]; 
      line->startIndex++; 
      word->length++; 
     } else { 
      break; 
     } 
    } 

    line->length = line->length - i; 

    return word; 
} 

: 나는이 기능을 설계했습니다.

extern String *subString; 
void test_getWordAndUpdate_should_get_the_first_word_from_a_line_of_instruction() { 
    String oneLineString = {"movwf 0x10", 0, 10}; 

    subString = getWordAndUpdate(&oneLineString, " ,;"); // works fine 

    TEST_ASSERT_EQUAL('m', subString->rawString[0]); 
    TEST_ASSERT_EQUAL('o', subString->rawString[1]); 
    TEST_ASSERT_EQUAL('v', subString->rawString[2]); 
    TEST_ASSERT_EQUAL('w', subString->rawString[3]); 
    TEST_ASSERT_EQUAL('f', subString->rawString[4]); 
    TEST_ASSERT_NOT_EQUAL(' ', subString->rawString[5]); 
    TEST_ASSERT_NOT_EQUAL('0', subString->rawString[6]); 
    TEST_ASSERT_NOT_EQUAL('x', subString->rawString[7]); 
    TEST_ASSERT_NOT_EQUAL('1', subString->rawString[8]); 
    TEST_ASSERT_NOT_EQUAL('0', subString->rawString[9]); 

    TEST_ASSERT_EQUAL(5, oneLineString.startIndex); 
    TEST_ASSERT_EQUAL(5, oneLineString.length); 
    TEST_ASSERT_EQUAL(0, subString->startIndex); 
    TEST_ASSERT_EQUAL(5, subString->length); 

    subString = getWordAndUpdate(&oneLineString, " ,;"); // bad memory access 
} 
+1

필자는 코드를 먼저 살펴보고 몇 가지 주요 문제점으로 보이는 것을 수정해야한다고 생각합니다. 1. 함수'getWordAndUpdate'는'delimiter' 인수를 사용하지 않습니다 ... 2.이 함수에 대한 두 번째 호출 결과는 메모리 누수와 함께 ... 3. 당신은'rawString' 배열을 어디에도 할당하지 않는 것처럼 보입니다 ... 그리고 아마도 몇 가지 문제가 더있을 것입니다 ... –

답변

1

당신은 기능 getWordAndUpdate 코드의 논문 라인에서 객체 oneLineString을 수정

line->length--; 
line->startIndex++; 

그래서, 두 번째 시간을 호출 할 때, 일치하지에서 개체.

oneLineString 사본을 만들거나 매개 변수를 수정하지 않는 알고리즘을 찾으십시오.

아마, 당신은 기능의 이런 종류의 사용할 수 있습니다

String *subString; 

String *getWordAndUpdate(String *line, char *delimiter) { 
    String *word = malloc(sizeof(String)); 

    int i; 
    for (i = 0; line->rawString[i] != ' '; ++i) 
     word->rawString[i] = line->rawString[i]; 
    word->length = i; 

    return word; 
} 

을 그리고 당신은 당신의 구분 매개 변수의 아직 처리하지 않습니다.