0

.ppmファイルを解析しfgetc、一度に 1 バイトずつ読み取り、255.0 で割って浮動小数点数に変換し、OpenGL コードで使用する色を取得しています。かんたんだよ。を使用して、デバッグ目的で数値を出力しますprintf("%f %f %f\n", color[0], color[1], color[2]);。ほとんどの場合、これはうまく機能しますが (最初の行を参照)、余分なゴミが出力されることがあります (2 行目を参照)。

0.086275 0.031373 0.000000
0.133333 0.000000 0.00<BA><B9>9?<D1><D0><D0>=<99><98>^X>3 0.078431 0.000000

なぜこれが考えられるのでしょうか?

アップデート:

float *read_eight_bit(FILE *file, int rows, int cols)                                                                                                                                                                                                                          
{                                                                                                                                                                                                                                                                              
   float *data = (float *)malloc(rows*cols*3*sizeof(float));                                                                                                                                                                                                                    
   int c;                                                                                                                                                                                                                                                                       
   int i, j, k;                                                                                                                                                                                                                                                                 
   for(i = 0; i < rows; i++) {                                                                                                                                                                                                                                                  
     for(j = 0; j < cols; j++) {                                                                                                                                                                                                                                                
         for(k = 0; k < 3; k++) {                                                                                                                                                                                                                                                 
           if((c = fgetc(file)) != EOF) {                                                                                                                                                                                                                                                              
             data[get_index(i, j, k, rows, cols)] = c/255.0f;                                                                                                                                                                                                                     
           }                                                                                                                                                                                                                                                                      
           else {                                                                                                                                                                                                                                                                 
             perror("reached unexpected EOF");                                                                                                                                                                                                                                    
             free(data);                                                                                                                                                                                                                                                          
             return NULL;                                                                                                                                                                                                                                                         
         }                                                                                                                                                                                                                                                                      
     }                                                                                                                                                                                                                                                                                                                                          
   return data;
}

これは、物事を読み取る実際のコードです。

4

1 に答える 1

1

これ以上のコードを見ずに考えることができる唯一の説明は、おそらくバッファ オーバーランまたはアンダーラン (配列外への書き込み) によって、スタックがめちゃくちゃになっているということです。

この種の問題の多くを検出できるため、cppcheckを介してコードを実行することをお勧めします。

于 2012-12-17T09:31:15.840 に答える