read_16 et write_16

Re: read_16 et write_16

by Jean-Cédric Chappelier -
Number of replies: 0

Oui, on peut en effet (c'est donc un chemin possible)

Mais, en fait il y a aussi plus simple ici car on parle ici du bus : on lit des données continues en mémoire (voir aussi la réponse de Cédric (au milieu) : https://moodlearchive.epfl.ch/2019-2020/mod/forum/discuss.php?d=27776#p55029).

Le code est fait assez simple ici ; mais je réalise par vos questions que ce n'est certainement pas encore très naturel  pour vous (car c'est « très C »). Je fais donc un petit complément de cours (voir à ce sujet l'exercice 3 de la série de cette semaine (série 5)) :
le type d'un pointeur sert juste à décoder la séquence de bits en mémoire. En C on peut tout à fait faire cela :
double x = 3.4;
int* ptr = &x;
Au travers de ptr on interprétera la séquence de bits de la représentation mémoire de 3.4 comme un entier (ce qui va donner « n'importe quoi » ; en fait ce sont les 32 premiers bits (si on a des int sur 32 bits) de l'écriture virgule flottante de 3.4)
Et si donc on voudrait (pour des raisons étranges) avoir exactement ces bits interprétés et stockés (copiés) comme un entier, on pourrait faire :
int i = *ptr;
Pour éviter que le compilateur ne râle, on pourrait explicitement dire que l'on force le changement d'interprétation de la mémoire (c'est optionnel) :
int* ptr = (int *) &x;

Et si je simplifie tout ça sans passer explicitement par ptr, cela donnerait :
int i = *((int *) &x);

Joli, non ?....
Heu non pas joli du tout, en fait, mais parfois très pratique lorsque justement la mémoire est correctement organisée (certainement pas le cas dans mon cas d'école présenté plus haut, mais certainement le cas sur votre bus de Game Boy ;-) ).
Voilà, ça c'est très « style C » . Si vous n'aimez pas, vous pouvez toujours faire comme suggéré par Yassin (merci !).