Malgré que j'ai moi-même participé à cette discussion, je dois avouer que je ne m'en rappellait pas du tout…
Mais du coup elle va m'être très utile, merci beaucoup.
Pour les unions, tu peux prendre l'exemple d'un registre de configuration d'un driver ou dans l'embarqué. Une union d'un entier d'un entier sur 8 bit avec une structure de bit field sur 1 bit permet de changer le registre soit bit par bit soit d'un seul tenant.
Après, d'autres exemples pertinents dans d'autres domaine, ca va être dur vu que le C n'est pertinent que dans l'embarqué/bas niveau1
on pourrait sortir les noeuds d'AST pour simuler un variant, mais écrire un compilateur en C en 2015 relève de la pure connerie et je pense que ca serait une erreur de le présenter. ↩
Hé ho ! Pas de gros mots et pas de trolls, hein ! Non, mais !
Le soucis, c'est que la norme ne garantit pas que la modification d'un champ se limite aux multiplets composant ce champ. Bien que cela soit pour ainsi dire toujours le cas, je préfère présenter un exemple qui respecte la norme.
Un ptit exemple que j'ai trouvé pour les unions : http://cpp.mesexemples.com/string/cc-exemple-dutilisation-dunion/
Ici, c'est la façon d'identifier un étudiant (id ou nom). Du coup, il est possible de penser à d'autres trucs du même style, des ressources identifiables de différentes façons.
Le code est mauvais (indentation chaotique, langage C/C++ (sic), norme non précisée). Et je ne me penche pas sur les potentiels comportements non définis ou non spécifiés.
Et je ne vois pas comment on peut faire confiance à un site où l'auteur ne teste même pas ses codes… qui utilise des variables comme etat, sans intérêt, etc. Bref je ne le conseillerais pas non plus.
Pour implémenter le DES, l'utilisation d'union me semble judicieuse. Mais c'est encore un cas particulier.
À un moment dans l'algo, on sépare les données en 2 parties. La partie de droites est traitée différemment de la partie de gauche.
Sachant que l'ensemble passait par une permutation totale (S-box) sur l'ensemble des données.
L'exemple est effectivement simple, mais le soucis c'est qu'il ne montre pas en quoi l'union est utile (mise à part pour gagner quelques octets en mémoire par rapport à une structure).
Juste pour dire : dans le cas où le retour de strlen() est supérieur à quatre-vingt, la fonction strcpy() n'est pas appelée et donc tu utilises le champ nom de l'union alors qu'il n'a pas été initialisé (ou plutôt juste en partie).
EDIT: de plus, tu accèdes au champ nom alors que c'est le champ ID qui a été modifié et inversément par après.
C'est une idée intéressante, mais malheureusement il s'agit de nouveau d'un cas non spécifié par la norme. J'ai d'ailleurs mal énoncé la règle dans mon message précédent : lors de la modification d'un champ d'une union, les autres champs prennent une valeur non spécifiée (qui dépend du compilateur).
Juste pour dire : dans le cas où le retour de strlen() est supérieur à quatre-vingt, la fonction strcpy() n'est pas appelée et donc tu utilises le champ nom de l'union alors qu'il n'a pas été initialisé (ou plutôt juste en partie).
C'est voulu, c'est en rapport avec son premier affichage où nom est vide…
EDIT: de plus, tu accèdes au champ nom alors que c'est le champ ID qui a été modifié et inversément par après
Oui mais ça semble être voulu par l'auteur de présenter nom comme chaine vide, puis nom comme une chaîne de caractères non vide… Après j'ai peut-être pas compris ce que tu voulais dire.
C'est possible, oui. Maintenant, s'agissant d'un concept auquel je recours rarement, je voulais savoir si je n'était pas passé à côté d'utilisations simples et plus basiques.
Oui, sauf que le contenu de la chaîne dépend grandement de la représentation des entiers. Sur une architecture petit-boutiste (le plus fréquent), celle-ci comprendra le caractère \f (en ASCII). Toutefois, s'il on a une représentation des entiers un peu spéciale avec des bits de bourrage et/ou des bits de parités, il y a un risque de débordement de tampon parce qu'il n'y aura pas de caractère nul.
La SDL utilise une grosse union de structures pour représenter tous les types d'événements (souris, clavier…) dans un même type SDL_Event. Je ne sais pas si présenter le code de la SDL est vraiment utile dans un tutoriel, mais l'idée de base pourrait donner un exemple intéressant.
Pas sur mais si on cherche un cas où l'union ne peut pas être substituée par une structure, il y a peut-être les fonctions prenant en paramètre des void* comme send. Elles sont pratiques pour passer des structures car chaque champ est automatiquement rempli à la réception.
Ptêt en fonction du champ envoyé, à la réception on lit le champ correspondant (id de l'étudiant ou son nom).
@SimSonic et Maluna34 : hmm… Il s'agit sans doute d'un des cas les plus simples et des plus explicites, effectivement. Merci, je pense que je vais me baser sur celui-ci pour la rédaction du chapitre.
Connectez-vous pour pouvoir poster un message.
Connexion
Pas encore membre ?
Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte