Friday, February 16, 2018

typedef u16 pageno_t

J'avoue que quand j'ai fait ma transition de l'assembleur vers le C, je faisais une mimique assez cocasse à la vue de uint32_t et size_t. Quoi, c'est un 'dword' (double-mot, jargon intel dans les assembleurs). Pourquoi aller lui donner un nom à coucher dehors pareil ? Bref, j'étais pas un fan de typedef, à part pour éviter de devoir écrire "struct" devant le nom de mes structures.

Mais sur l'année écoulée, j'ai eu droit à plusieurs situations du genre "int bitrate". Ah oui? en quelle unité, s'il vous plait, le bitrate ? bit/seconde ? kilobit/seconde ? megabit/seconde ? Et dans le code de mon moteur de jeu, "int x" ou "int width" est à peu près pareil. Est-ce que x est une coordonnée absolue (dans le niveau) ou relative (à l'écran) ? est-ce qu'elle est exprimée en pixels ? en tiles (si, si, souvenez vous, les petits pavés élémentaires de graphisme) ? en 256eme de pixel pour les calculs de déplacement avant affichage ?

Alors bien sûr, on peut tenter "int kbps, int x_in_tiles", etc. Mais pourquoi. Pourquoi faire rentrer dans le nom de la variable une information (l'unité de mesure) qui dénote plutôt de son type (on peut additionner deux valeurs en kbps entre elles, mais pas des Mbps et des kbps sans faire une conversion au préalable). Bref, j'ai pris l'habitude de construire des types qui expriment des unités de mesure. Beaucoup. Au point que je me méfie presque maintenant du code qui annonce juste un "int" parce que dès qu'on va commencer à intégrer des morceaux de code qui viennent d'horizon différents, on aura aucun moyen de se souvenir si le "* 1000" qui est là dans l'appel de fonction est justifié ou non.

Et comme je viens d'atteindre le point ou la branche "revisite pour cause de tutoriel" de mon moteur de jeu est prête à recevoir le code servant à charger des fichiers .spr, ce serait peut-être le bon moment pour y introduire des types comme "numéro de page, numéro de bloc, numéro de tile", etc.

3 comments:

Sylvain Pypebros said...

ça aurait été chouette d'utiliser -Wconversion pour faciliter la mise à niveau du code, mais c'est l'horreur avec devkitpro https://stackoverflow.com/questions/48850613/what-should-i-use-instead-of-wconversion?noredirect=1#comment84708027_48850613

Sylvain Pypebros said...

Bon, okay, POSIX tries to reserve identifiers ending with _t for its own purposes (https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier/228797#228797)
- alsa
- linux kernel
- boost
- cairo
- dbus
- libdirac
- libgcrypt

granted, most of them use __t rather than something as short as pageno_t.

Sylvain Pypebros said...

Sprite Editor is no longer showing the contents of the grid.
- since GuiLayers update
- because SUB_BG3 isn't enabled.
Thanks mercurial to make it easy to identify.