J'ai un fichier de données binaires. Il existe plus de 4 millions d'enregistrements de données LIDAR. Chaque enregistrement est stocké sous la forme de quatre nombres - trois flottants (coordonnées x, y, z) et un entier (sans importance maintenant). Je devrais implémenter une fonction qui obtient des coordonnées minimales et maximales dans tous les axes. J'ai écrit le code ci-dessous, l'algorithme semble être très simple et simple, mais ça ne marche pas (il renvoie tous les minimums comme 0.0f et chaque maximum comme 1.0f). Est-ce que j'ai quelque chose de mal?Lecture des données binaires - trouver les coordonnées min et max
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 ???
}
Note: les codes de sortie négatifs sont normalement réservés à l'environnement. Vous devriez retourner de petits entiers positifs. Pourquoi ne vérifiez-vous pas le résultat de 'fread'? Pourquoi utiliser feof? – Olaf
Et pourquoi est-ce marqué C, bien qu'il soit évidemment C++? – Olaf
Vos nombres maximum sont définis comme '-std :: numeric_limits :: max();'. Maintenant, cela pourrait être une faute de frappe, mais il a un - le rendant négatif. –