2017-03-21 11 views
0

バイナリデータファイルがあります。 4百万以上のLIDARデータレコードがあります。すべてのレコードは、3つの浮動小数点(座標x、y、z)と1つの整数(今は重要ではない)の4つの数値として格納されます。すべての軸で最小と最大の座標を取得する関数を実装する必要があります。私は以下のコードを書いたが、アルゴリズムは非常に簡単でシンプルに見えるが、動作していない(すべての最小値を0.0f、すべての最小値を1.0fとして返す)。何か悪いことはありますか?バイナリデータの読み取り - 最小および最大座標の検索

void get_min_max(const char *filename, float *a_min_x, float *a_max_x, float *a_min_y, float *a_max_y, float *a_min_z, float *a_max_z) { 
    FILE *f = NULL; 
    float x, y, z; 
    float min_x, min_y, min_z, max_x, max_y, max_z; 
    int l_type; 

    f = fopen(filename, "rb"); 

    if (!f) { 
    printf("No binary file read!\n"); 
    exit(-1); 
    } 

    min_x = min_y = min_z = std::numeric_limits<float>::max(); 
    max_x = max_y = max_z = -std::numeric_limits<float>::max(); 

    while (true) { 
    x = fread((void*)(&x), sizeof(x), 1, f); 
    y = fread((void*)(&y), sizeof(y), 1, f); 
    z = fread((void*)(&z), sizeof(z), 1, f); 

    min_x = fminf(x, min_x); 
    min_y = fminf(y, min_y); 
    min_z = fminf(z, min_z); 

    max_x = fmaxf(x, max_x); 
    max_y = fmaxf(y, max_y); 
    max_z = fmaxf(z, max_z); 

    l_type = fread((void*)(&l_type), sizeof(l_type), 1, f); 

    if (feof(f)) { 
     break; 
    } 
    } 

    fclose(f); 

    *a_min_x = min_x; // = 0.0f ??? 
    *a_min_y = min_y; // = 0.0f ??? 
    *a_min_z = min_z; // = 0.0f ??? 

    *a_max_x = max_x; // = 1.0f ??? 
    *a_max_y = max_y; // = 1.0f ??? 
    *a_max_z = max_z; // = 1.0f ??? 
} 
+1

サイドノート:マイナスの終了コードは、通常、エンフォースメントのために予約されています。小さい正の整数を返す必要があります。なぜあなたは 'fread'の結果をチェックしませんか?なぜ 'feof'を使うのですか? – Olaf

+1

そしてなぜC++であるのですが、なぜこのタグが付けられていますか? – Olaf

+0

あなたの最大数は '-std :: numeric_limits :: max();'と定義されています。さて、それはタイプミスかもしれませんが、それは否定的にしています。 –

答えて

5

あなたの問題は、あなたの変数にfreadの結果を代入します

x = fread(&x, ...) 

まずfreadは、xにデータを読み込み、それは要素の数は、(1)を読んで返し、xが1.0になっ。

あなたは実際にデバッガを使用する方法を学ぶ必要があります。

+0

もう一度、ありがとう。あなたは正しいです、私はそれを学びます。 – Honza

関連する問題