Rédaction tutoriel C

(auto)recrutement

a marqué ce sujet comme résolu.

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



  1. 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.  

+1 -0

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 niveau.

1. 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.

Davidbrcz

Hé ho ! Pas de gros mots et pas de trolls, hein ! Non, mais !

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.

Davidbrcz

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.

+0 -0

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.

À la rigueur l'exemple pourrait être

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <string.h>

#define MAX_LEN 80

union etudiant
 {
  int ID;
  char nom[MAX_LEN];
};

int main(void)
{

    union etudiant e;
    const char *s = "Sakoba";

    e.ID=12;

    printf("ID= %d, Nom: %s\n", e.ID, e.nom);

    if (strlen(s) < MAX_LEN)
        strcpy(e.nom, s);

    printf("ID= %d, Nom: %s\n", e.ID, e.nom);

    return 0;
}
+0 -0

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.

Je viens de chercher le code que ça donnait :

1
2
3
4
5
6
7
8
  union block
  {
     unsigned char D[8];
     struct 
     {
        unsigned char G[4], D[4];
      }d;
  };
+0 -0

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.

Maluna34

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).

À la rigueur l'exemple pourrait être […]

fred1599

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.

Pour implémenter le DES, l'utilisation d'union me semble judicieuse. Mais c'est encore un cas particulier […].

ache

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).

With one exception, if a member of a union object is accessed after a value has been stored in a different member of the object, the behavior is implementation-defined.

X3J11/88-090, 3.3.2.3, § 5

+0 -0

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.

+0 -0

Si tu ne trouve pas de cas d'utilisation pour le niveau de tes lecteurs c'est peut être qu'il est trop tôt pour leur présenter.

Kje

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 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.

fred1599

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.

+0 -0

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).

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