2012-12-13 2 views
0

저는 아주 간단한 프로그램을 만들고 있습니다. 약간의 로봇 봇 AI 종류에 대해 이야기하고 있으며, 프로그램을 위해서 C++ 코드를 가지고 있습니다. 어떤 오류도 발생하지 않지만 실행하면 응답하지 않는 것처럼 program.exe가 작동을 중지했다는 창이 나타납니다. 내 코드 :C++ 프로그램이 작동을 멈췄습니다.

#include<iostream> 
#include<string.h> 
#include<cmath> 
#include<vector> 
#include<ctime> 
#include<conio.h> 
#include<algorithm> 
#include<cstdlib> 
using namespace std; 

struct strarray{ 
    char* array[]; 
}; 

struct keyword{ 
    string keywords; 
    string responses[];  
}; 


keyword * dictionary = new keyword[2]; 
keyword defaultr; 

keyword getMatch(string key); 
string sconvert(string con); 
void init(); 
string getResp(keyword key); 

bool cont=true; 

int main(int argc, char* argv[]){ 
    string input; 
    while(cont){ 
      getline(cin,input); 
      cout << getResp(getMatch(input)); 
      getch(); 
      getch(); 
    } 
} 

string sconvert(string con){ 
    con.erase(remove_if(con.begin(), con.end(), ::isspace), con.end()); 
    con.erase(remove_if(con.begin(), con.end(), ::ispunct), con.end()); 
    return con; 
} 

void init(){ 
    srand(time(NULL)); 
    dictionary[0].keywords="hello"; 
    dictionary[0].responses[0]="Hello, how have you been?"; 
    dictionary[0].responses[1]="Hello, have you missed me?"; 
    dictionary[0].responses[2]="Hey, how's it going?"; 
    defaultr.responses[0]="That's interesting, tell me more."; 
    defaultr.responses[1]="Please, tell me more."; 
} 

keyword getMatch(string key){ 
    for(int i=0; i<sizeof(dictionary); i++){ 
      if(key==dictionary[i].keywords){return dictionary[i];} 
    } 
    return defaultr; 
} 

string getResp(keyword key){ 
    return key.responses[rand() % sizeof(key)]; 
} 

실행하면 정상적으로 열리지 만 입력 할 때 입력하면 "작동을 멈 춥니 다." 누군가 내가 왜 변해야하는지 말해 주시겠습니까?

몇 가지 포인터 문제가 있습니까? rand을 사용하거나 나는 정말로 혼란스럽고이 프로그램을 더 잘 활용할 수있는 방법에 대한 조언을 주시면 감사하겠습니다.

+1

:

당신은 또한 struct keyword을 변경해야합니다. – ryanbwork

+2

디버거를 실행하지 않는 것 같습니다. 예외가 발생하면 디버거를 실행해야하며 충돌이 발생한 이유를 정확히 알 수 있습니다. – evanmcdonnal

+4

STL의 고급 무언가와 STL의 완전한 무지가 얼마나 매력적인가? 나는 intruiged. 'std :: map'과'std :: vector'를 사용하는 방법을 찾으십시오. 그러면이 코드가 훨씬 쉽고 오류가 발생하기 쉽습니다. –

답변

1

우선 무한 루프가 있으므로 프로그램이 영원히 작동해야합니다. 코드를 한 번 살펴본 후 rand() % sizeof (key)를 잘못 사용하면 응답이 미리 설정되지 않았거나 예를

struct keyword { 
    string keywords; 
    string responses[2];  
}; 
rand() % sizeof(key.responses) 

에 대한 특정 값이 아니면 만들처럼 구성이

struct keyword { 
    string keywords; 
    vector<string> responses;  
}; 
rand() % key.responses.size() 
//After setting the responses by push_back for example 

가 다른 방법이 있지만 ...이 더 안전하고 더 메모리 관리가 필요하지

+0

sizeof (key.responses)로 변경하고 무한 루프를 실현했습니다. 의도적으로 그렇게 했으므로 나중에 변경하겠습니다. 응답 배열의 크기에 대한 정의를 추가했는데 여전히 분할 오류가 발생합니다. BTW, 나는 몇 가지를 편집했는데, 그것은 확실히 getmatch 함수 중에 있었고, wtf는 여기에 잘못되었다. 누군가 나에게 말해 준다. – user1478209

+0

새 코드 작성 ..한 가지 더 모든 키워드를 초기화하는 것이 더 낫습니다. – Ibrahim

2

sizeof(dictionary)sizeof(keyword*), 아마도 4 또는 8이 될 것이므로 사전 배열 끝을 반복하고 종료하십시오.

가장 쉬운 수정 : 배열 길이를 저장할 상수를 정의하십시오.

const dictionarySize = 2; 

및 그 전체에서 사용하십시오. 사전 초기화 결코 극복 그래서 당신은 당신의 init() 메소드를 호출하지

하나
struct keyword{ 
    string keywords; 
    string responses[3];  
}; 
+0

고마워요, 실제로 도움이되는 나머지 사람들과 달리, 저에게 어떤 도움도주지 않고 비난 해 주셨습니다. – user1478209

+0

더 나은 점은 배열이 아닌 크기를 알고있는 std :: vector 나 다른 컨테이너를 사용하는 것입니다. –

관련 문제