2017-11-10 25 views
2

SDL이 포함 된 C에서 "누가 백만장자가 되길 원합니다"게임을 쓰고 있습니다. SDL 그래픽을 개발하고 데이터 처리를 별도로 수행했습니다. 후자가 하나인데 문제가 있습니다.C 프로그램은 SIGTRAP 신호를받습니다. 3 회마다 잘 작동합니다.

이 파일은 약. 5000 줄의 .csv 파일을 가져 와서 동적으로 할당 된 메모리 덕분에 세부 사항을 구조체에 넣습니다. 그러면 콘솔에 인쇄됩니다. 그러나 매 3 회마다 작동합니다. 다른 시간에 프로그램이 멈 춥니 다. 디버깅 시도, 그것은 말했다 :

프로그램 수신 신호 SIGTRAP, 추적/중단 점 트랩. 희망 - - 철저하게 충분한 유래를 검색하지 않고, 내가 않았다

size_t getline(char **lineptr, size_t *n, FILE *stream) { 
    char *bufptr = NULL; 
    char *p = bufptr; 
    size_t size; 
    int c; 

    if (lineptr == NULL) { 
     return -1; 
    } 
    if (stream == NULL) { 
     return -1; 
    } 
    if (n == NULL) { 
     return -1; 
    } 
    bufptr = *lineptr; 
    size = *n; 

    c = fgetc(stream); 
    if (c == EOF) { 
     return -1; 
    } 
    if (bufptr == NULL) { 
     bufptr = malloc(128); 
     if (bufptr == NULL) { 
      return -1; 
     } 
     size = 128; 
    } 
    p = bufptr; 
    while(c != EOF) { 
     if ((p - bufptr) > (size - 1)) { 
      size = size + 128; 
      bufptr = realloc(bufptr, size); 
      if (bufptr == NULL) { 
       return -1; 
      } 
     } 
     *p++ = c; 
     if (c == '\n') { 
      break; 
     } 
     c = fgetc(stream); 
    } 

    *p++ = '\0'; 
    *lineptr = bufptr; 
    *n = size; 

    return p - bufptr - 1; 
} 

:

while ((read = getline(&line, &n, kerdes)) != -1) { 
    sp = p = line; 
    field = 0; 
    // The below line triggers the signal 
    questions[cnt] = (Question*) malloc(sizeof(Question)); 

    // Cuts 
    while (*p != '\0') { 
     if (*p == ',') { 
      *p = 0; 

      if (field == 0) questions[cnt]->nth = atoi(sp); 
      if (field == 1) questions[cnt]->question_to = strdup(sp); 
      if (field == 2) questions[cnt]->answer_a = strdup(sp); 
      if (field == 3) questions[cnt]->answer_b = strdup(sp); 
      if (field == 4) questions[cnt]->answer_c = strdup(sp); 
      if (field == 5) questions[cnt]->answer_d = strdup(sp); 
      if (field == 6) questions[cnt]->answer_r = strdup(sp); 
      if (field == 7) questions[cnt]->cat = strdup(sp); 

      *p = ','; 
      sp = p + 1; 
      field++; 
     } 
     p++; 
    } 
    cnt++; 
} 

getline 기능은 this answer의 하나입니다 :

내가이 부분에 문제를 좁혀 생각 어떤 성공.

무엇이 문제입니까?
오버 인덱싱이 내 의견으로 뒤 따르지 않으며 free()가 잘 사용됩니다. , Click here

+0

@AnttiHaapala 전체 코드는 내 게시물의 하단에있는 링크를 통해 액세스 할 수 있습니다. 발췌문이 주석으로 처리되면 문제가 발생하지 않습니다. 따라서이 부분 만 강조되었습니다. –

+0

나는 발췌 부분을 가지고 있지만 * 질문은 그대로 서 있어야합니다. –

+0

@AnttiHaapala 나는 당신이 의미하는 것을보고 더 잘하려고 노력할 것입니다. 그동안 CSV가 업로드되었습니다 –

답변

0

문제는 getline 코드입니다 : Click here

CSV 파일 (영어가 아닌) 다음과 같은 링크를 사용하여 액세스 :

이 링크를, 페이스트 빈에 전체 .c 파일을 찾아주세요 그건 아주 까다 롭습니다. 나는 POSIX 표준 getline으로 바꾸 었으며 완벽하게 작동합니다. 따라서 라인 *p++ = c;realloc (그리고 아마도 것)을 새로운 버퍼에 대한 포인터를 반환 할 수 있습니다

p = bufptr; 
while(c != EOF) { 
    if ((p - bufptr) > (size - 1)) { 
     size = size + 128; 
     bufptr = realloc(bufptr, size); 
     if (bufptr == NULL) { 
      return -1; 
     } 
    } 
    *p++ = c; 
    if (c == '\n') { 
     break; 
    } 
    c = fgetc(stream); 
} 

하지만 p 이전 버퍼를 가리 킵니다 : 문제는 여기에 realloc 코드 정의되지 않은 동작 있습니다.

I have now provided a (hopefully) fixed version of that getline implementation in my answer to the getline question.

+0

지적 해 주셔서 감사합니다. 당신의 헌신에 감사드립니다! 그러나'getline()'을 stdio.h에 포함되어 있지 않으므로 사용할 수 없습니다. "getline에 대한 정의되지 않은 참조" –

+0

명령이 없으면 Win10 및 Code :: Blocks (16.0.1)가 필요합니다. 처음부터 몇 가지 알려진 호환성 문제가 있었지만 수정 사항이 제공되었습니다. –