Erreur compilation structure
mamiemando Messages postés 33539 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 février 2025 - 6 janv. 2025 à 16:22
- Erreur compilation structure
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Erreur 1001 outlook - Accueil - Bureautique
- Structure d'un rapport de stage - Guide
2 réponses
Ta définition:
unsigned char payload[];
n'a aucune dimension.
Le compilateur ne sait pas combien de place réserver pour ce tableau. Il te demande donc de leplacer à la fin de la structure.
Ça risque tout de même de conduire à un comportement indéterminé si tu essaies de mettre quelque chose dans ce tableau.
Aussi, tu demandes de "packter" la structure et tu as compilé sur une machine 64 bits.
Avec ton 16+16+8+8+8+16, ça se compacte mal.
Le compilateur s'attend à ce que le tableau commence au début d'un groupe de 64 bits.
Il faudra sans doute interchanger le dernier 8 bits avec le dernier 16 bits et faire du "padding".
6 janv. 2025 à 16:22
Bonjour,
Ce serait intéressant de préciser quel protocole (plus exactement quel paquet de quel RFC) tu es en train d'implémenter. Faisons sans en attendant.
Pour définir une structure, chaque type imbriqué doit avoir une taille. Comme le dit PierrotLeFou (#1) le type unsigned char[] n'a pas de taille bien définie .
A contrario :
- unsigned char[10] (qui ferait 10 octets, avec allocation statique, mais nécessite de savoir que 10 octets est une borne supérieure suffisante)
- unsigned char * (qui ferait la taille d'une adresse mémoire, par exemple 64 bits soit 8 octets sur un système 64 bits, mais qui nécessiterait une allocation dynamique avec malloc ou calloc (en C) ou new (en C++) et à terme une libération avec free).
Vu qu'ici tu craftes un paquet, dont la taille du payload n'est a priori pas connue l'avance. Dans le cas général un paquet peut être assez gros (typiquement bornée par le MTU) et il n'y a aucune raison de payer une telle taille, donc une allocation statique est contre indiquée.
- En C, tu n'aurais pas le choix, il faudrait passer par un pointeur
#include <stdint.h> struct ... { uint8_t *payload; } ... ;
- En C++ tu pourrais aussi envisager d'utiliser un vector.
#include <cstdint> #include <vector> struct ... { std::vector<uint8_t> payload; } ... ;
Dans les deux cas, le header et le payload de ta structure de paquet ne sont pas adjacents en mémoire. Tu ne peux donc pas directement recopier ta structure pour l'envoyer sur le réseau :
- dans la version C, tu ne recopierais que l'adresse du payload (mais pas le payload)
- dans la version C++, tu recopierais en plus du header et le payload les éléments stockés dans une instance de vector.
Ainsi, dans les deux cas, tu devras recopier d'abord le header, puis ensuite le payload (donc en deux memcpy). Je ne pense pas que packer la structure ici soit indiqué car tous tes types sont des multiples d'un octet.
Enfin, sauf erreur de ma part, je ne pense pas que __attribute__((packed)) soit dans le cas précédent nécessaire ou indiqué. Chaque attribut de ton header a une taille multiple de 8 bits et donc tombe "là où il faut" (ce ne serait pas le cas par exemple pour les premiers attributs d'un header IPv4).
Bonne chance