2012-03-27 2 views
0

내가 줄 단위를 파일을 읽으려고하고,정수 점진 응용 프로그램

(로봇 객체가 이해할 수있는 지시 사항에 대한 정보를 보유) '명령'이라는 객체 데이터의 라인을 저장하고 충돌 나는 1 변수 "IDX을"증가 (구문을 사용하여 : IDX를 ++)하려고 할 때 그래서 기본적으로

int robot::readfile(const char fname[]) { 
    FILE *rf; 
    rf = fopen(fname, "r"); 

    if (rf != NULL) { 
     int idx = 0; 
     char record[161]; 

     while ((this->cmd_count < this->cmd_size) 
       && (fgets(record, 160, rf) != NULL)) { 
      command tmp_cmd(record); 
      this->cmds[idx++] = tmp_cmd; 
     } 
    } else { 
     perror(fname); 
    } 

    fclose(rf); 
    return 1; 
} 

, 위의 코드에서, 다음은 읽기 기능 (C++에서), 그것은 기본적으로 그냥 응용 프로그램을 충돌합니다.

왜 그런가?

편집 : 주석 기에서 reqested으로 :

void robot::cmd_malloc(int size) { 
    // most likely will cause problems if size is below 1. 
    if (size < 1) { 
     return; 
    } 

    try { 
     this->cmds = new command[size]; 
     this->cmd_size = size; 
     this->cmd_count = 0; 
    } catch (std::bad_alloc) { 
     // bad allocation exception. 
     this->cmds = NULL; 
     cout << "bad_alloc:" << (sizeof(command) * size) << " in 'robot::cmd_malloc'." << endl; 
    } 

} 
+2

당신이 제대로 초기화하지 않은 테이블'cmds'에 색인을 생성하는 것이 아니라 충돌을 일으키는 것이 확실합니까? 'cmds'를 초기화하는 코드를 볼 수 있습니까? – templatetypedef

+3

당신은 결코'this-> cmd_count'를 증가시키지 않으십니까? –

+0

예, 확신합니다. 나는 심지어 배열의 증가를 제거하려고 노력했다. 그리고 확실한 - 질문을 지금 업데이트하십시오! – TheAJ

답변

3

당신은 어떤 점 idx에서 의미 루프에 cmd_count을 증가하지 않을 충돌하는 프로그램을 원인 cmd_size 이상이된다. 코드를 작성의

는 C++ 스타일은 사용하는 것입니다

  • std::vector<command> 대신 new command[size]. std::vector을 사용하는 경우 메모리 관리를 직접 수행 할 필요가 없으며 벡터 자체가 각각 size()capacity() 멤버 함수를 통해 해당 정보를 제공하므로 cmd_sizecmd_count이라는 두 개의 다른 변수를 유지할 필요가 없습니다.

  • std::ifstream 대신에 FILE*. 그리고 루프에서 입력을 읽는 동안 char[161] 대신 std::string을 사용해야합니다. 은 아니지만이 부분에 대해서는이 아닙니다. 정확히 어떤 데이터를 스트림에서 읽으려고하는지 잘 모르겠습니다.

+1

감사합니다. 문제가 해결 된 것 같습니다. 코딩 스타일에 대한 귀하의 제안에 대해서도 - 팁 주셔서 감사하지만, 슬프게도 내 교수님은 지난 두 학기 동안 우리가 배운 것을 사용하도록 허락하셨습니다. – TheAJ

관련 문제