2012-01-20 11 views
0

valgrindがエラーを返すため、OPTアルゴリズムに問題があります(条件付きジャンプまたは移動は初期化されていない値に依存します) 87。私はそれが "休憩"と関係があると思います、これを修正する方法はありますか?C - Valgrindと "条件付きジャンプまたは移動が初期化されていない値に依存する"エラー

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 

int convert_one_char(const char c) { 
    if(c == '0') return 0; 
    else if(c == '1') return 1; 
    else if(c == '2') return 2; 
    else if(c == '3') return 3; 
    else if(c == '4') return 4; 
    else if(c == '5') return 5; 
    else if(c == '6') return 6; 
    else if(c == '7') return 7; 
    else if(c == '8') return 8; 
    else if(c == '9') return 9; 
    else return -1; 
} 

void print(int n[], int size) { 
    int i; 
    for (i = 0; i < size; i++) { 
    printf("%d", n[i]); 
    if (i != size-1) { 
     printf(" | "); 
    } else { 
     printf(": "); 
    } 
    } 
} 

int main (int argc, char *argv[]) { 
    /* argc should be 3 */ 
    if (argc != 3) { 
    printf("Napaka: Potrebna sta 2 argumenta!\n"); 
    } else { 
    FILE *file = freopen(argv[2], "r", stdin); 
    if (file == 0) { 
     printf("Napaka: 404!\n"); 
    } else { 
     int num_count = 0, len = atoi(argv[1]), buff[80], i = 0; 
     char c; 

     /* read file contents */ 
     do { 
     c = getchar(); 
     if (i%2 == 0 && isdigit(c)) { 
      buff[num_count] = convert_one_char(c); 
      num_count++; 
     } 
     i++; 
     } while (c != EOF); 

     /* print parsed file */ 
     printf("Referencni niz: "); 
     for (i = 0; i < num_count; i++) printf("%d ", buff[i]); 

     printf("\n"); 

     /* opt algorithm */ 

     int frameset[len]; 
     int flag[len]; 
     for (i = 0; i < len; i++) { 
     frameset[i] = -1; 
     flag[i] = 0; 
     } 

     int j, s, k, tmp, available = 1, max = 0, pos, pf = 0; 

     for (i = 0; i < len; i++) { 
     frameset[i] = buff[i]; 
     print(frameset, len); 
     printf("Vstavim %d\n", buff[i]); 
     pf++; 
     } 

     while (i < num_count) { 
     max = 0; 
     for (k = 0; k < len; k++) if (frameset[k] == buff[i]) available = 0; 

     if(available == 1) { 
      for(j = 0; j < len; j++) { 

      for(s = i+1; s >= 0; s++) { 
       if(frameset[j] == buff[s]) { 
       flag[j] = s; // <<< line 87 
       break; 
       } 

       if(s >= num_count) { 
       flag[j] = 100; 
       break; 
       } 
      } 
      } 
      for(k = 0; k < len; k++) { 
      if (flag[k] > max) { 
       max = flag[k]; 
       pos = k; 
      } 
      } 


      frameset[pos] = buff[i]; 
      print(frameset, len); 
      printf("Vstavim %d\n", buff[i]); 

      pf++; 
     } else { 
      i++; 
      available = 1; 
     } 
     }   

     printf("\n\nStevilo napak: %d\n", pf); 
     fclose(file); 
    } 
    } 
} 
+0

あなたのconvert_one_charはずっと簡単かもしれません。ちょうど 'c - '0' 'をしてください。それはある種のTDWTFコードです。 –

+0

'convert_one_char()'を次のように圧縮することができます: 'int convert_one_char(char c){if(isdigit(c))はcを返します。それ以外の場合-1を返します。 } '。 –

+1

行番号を記載したものを投稿するときは、その行に参照している行を示すコメントをコードに挿入する必要があります。 –

答えて

1

あなたが何かにあなたのbuff[80]frameset[len]のすべての要素を初期化する必要があるようにそうあなたが読んされます80より大きくないかもしれ0

また、あなたはまた、をlenのことを確認する必要があります。..ようです配列の外側にあります。

私は "int型J、S、K、TMP、1 =利用可能、最大= 0、POS、PF = 0;" として、あなたはすべての変数を初期化する必要があると思います
if(frameset[j] == buff[s]) { 
       flag[j] = s; 
       break; 
       } 
+0

buff [80]のすべての要素を初期化して私の問題を解決しました。どうもありがとう! – c4rrt3r

+0

意味のある値でなくてもすべてが初期化されていることを確認することで、問題が何であっても、 'buff [80]' _hid_を初期化するといいでしょう。明らかに 'buff [s]'はあなたのコードによって設定されていません。これは、 'len == num_count - 1'の最初の' s'反復で起こります。また、あなたの 's'反復は、減少しているように見えるときに増加しています。このコードで何をしようとしていますか? –

+1

この 'valgrind'警告を避けるために' if(s> = num_count) 'check(' frameset [j] == buff [s]) 'チェックを行うことをお勧めします。 –

0

あなたは...

EDITを条件分岐内のすべてのこれらの変数を使用しているので:それも良い方法です...ライン85のループのための

+0

私は同意しません。すべてを初期化すると、 'valgrind'がバグを捕まえる機会がなくなります。 _meaningful_開始値がないかぎり、私は変数が必要になるまで設定しないことを好みます。 (NULLにアクセスしようとすると、間違って他の人のメモリを壊すのを避けながら、何かが間違っていることを「予測可能かつ安全に」示すことになるので、ポインタは重要な例外です) –

+0

ここに:http://www.faqs.org/docs/Linux-HOWTO/Valgrind-HOWTO.html申し訳ありませんリンクだけでコピー&ペーストが長すぎる場合は、この段落を探してください: "4.2.3.1初期化されていないメモリの使用 " –

1

ザ・奇妙に見えます。あなたはsをインクリメントしており、0より大きい間は続きます。しかし、私は私に負ではないので、常に0より大きいでしょう。また、ちょうど設定されているように、私は正しく初期化されていません。 71行目のループの後にlenにします。これは設計によるのでしょうか?

基本的には、あなたはbuff [s]と比較しているように見えますが、buffを初期化したときよりも増分しています。

+0

+1、良いキャッチ。特に 's'は' MAX_INT'になるまで動いてからオーバーフローします。これは未定義の動作です。 –

+0

実際には、ループブレイクのためにs> = num_countのとき(num_countは解析された要素の数です) – c4rrt3r

+0

はい、 'break'ですが、' if(frameset [j] == buff [s]) 'チェックを実行した後です。 'len == num_count - 1'の場合、最初の' s'値は 'len'なので、この比較には初期化されていないメモリにアクセスする必要があります。 –

関連する問題