L'alignement de la structure dépend de la mise en œuvre. Cependant, la plupart des compilateurs vous donnent un moyen de spécifier qu'une structure doit être "empaquetée" (c'est-à-dire, disposée en mémoire sans octets de remplissage entre les champs). Par exemple:
struct Vector {
float x;
float y;
float z;
} __attribute__((__packed__));
Le code ci-dessus provoquera le compilateur gcc pour emballer la structure en mémoire, ce qui rend plus facile à vider un fichier et lire plus tard. La manière exacte de faire ceci peut être différente pour votre compilateur (les détails devraient être dans le manuel de votre compilateur).
Je liste toujours les membres des structures empaquetées sur des lignes séparées afin d'être clair sur l'ordre dans lequel elles doivent apparaître. Pour la plupart des compilateurs cela devrait être équivalent à float x, y, z;
mais je ne suis pas certain que ce soit un comportement dépendant de l'implémentation ou pas. Pour être sûr, j'utiliserais une déclaration par ligne.
Si vous lisez les données d'un fichier, vous devez valider les données avant de les transmettre au func
. Aucune application de l'alignement des données ne compensera le manque de validation des entrées.
Edit:
Après la lecture de votre code plus, je comprends plus ce que vous essayez de faire. Vous avez une structure qui contient trois valeurs float
et vous y accédez avec un float*
comme s'il s'agissait d'un tableau de flottants. C'est une très mauvaise pratique. Vous ne connaissez pas le type de remplissage que votre compilateur pourrait utiliser au début ou à la fin de votre structure. Même avec une structure empaquetée, il n'est pas sûr de traiter la structure comme un tableau. Si un tableau est ce que vous voulez, utilisez un tableau. Le moyen le plus sûr est de lire les données à partir du fichier, de le stocker dans un nouvel objet de type struct Vector
et de le passer à func
. Si func
est défini pour prendre un struct Vector*
comme argument et que votre compilateur vous permet de passer un float*
sans vous agripper, il s'agit en effet d'un comportement dépendant de l'implémentation sur lequel vous ne devez pas compter.
Votre article est très difficile à lire. –
Ce n'est pas C++ comme vous l'avez maintenant. Votre utilisation ne compilera pas et ne montre pas comment vous voulez utiliser le vecteur en question. Veuillez modifier l'utilisation pour montrer ce que load() accepte et retourne. De plus, coords est un pointeur flottant dans votre exemple (sorte de) et func veut un pointeur vectoriel. –
Écrire des données binaires dans un fichier et lire ce retour n'est pas portable. Il y a juste trop de variations entre les machines. Il est beaucoup plus facile de sérialiser les données (écrire en tant que texte), puis sérialiser à l'entrée dans la structure. –