2017-11-10 5 views
2

私は、SDLが含まれている、「誰が億万長者になる」と書いています。 私はSDLグラフィックスと別途データ処理を開発しました。 後者が問題です。CプログラムはシグナルSIGTRAPを受信し、すべての3回目の試行でうまく動作します。

これは、およそ5000行の.csvファイルを取得し、動的に割り当てられたメモリの助けを借りて詳細を構造に入れます。 それはコンソールに印刷されます。 しかし、それは毎回3回程度しか動作しません。 その他の場合、プログラムがフリーズします。 デバッグしようとしました:

プログラム受信シグナルSIGTRAP、トレース/ブレークポイントトラップ。

は、私がこの部分に問題を絞り込ん考える:

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からいずれかです。

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; 
} 

私がやった - うまくいけば - せず、徹底的に十分なstackoverflowのを検索任意の成功。

何が問題が発生する可能性がありますか?
私の意見では、オーバーインデックスはそれの後ろではなく、free()はうまく使用されています。

このリンク以下、ペーストビン上の全体.cファイルを見つけてください: Click here

CSVファイル(非英語)次のリンクを使用してアクセスできます。Click here

+0

@AnttiHaapala全体のコードは、私の記事の下部にあるリンクを介してアクセス可能です。抜粋がコメントアウトされている場合、問題は発生しません。したがって、この部分だけが強調表示されています。 –

+0

私は抜粋を持っていますが、*質問*はそのまま自立していなければなりません。 –

+0

@AnttiHaapala私はあなたが何を意味するかを見て、より良くしようとします。その間、CSVはアップロードされました –

答えて

0

問題は、getlineコードでありますそれは非常に大変です。私はそれをPOSIX標準getlineに置き換えました。それは完璧に動作します。ここでの問題は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); 
} 

reallocは(そしておそらく新しいバッファへのポインタを返すことができますが、pが古いバッファ、したがって、ラインを指すようになります*p++ = c;の定義されていない動作があります。

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)が必要です。 最初から既知の互換性の問題がありましたが、修正が提供されました。 –

関連する問題