82Fermer84
SallyLe 16/04/2009 à 00:13
./75 > ben void*, c'est un pointeur que tu ne peux pas déréférencer, donc c'est un peu bizarre cheeky (en effet déréférencer le pointeur signifierait que tu veux lire ou écrire une valeur de type void, ce qui n'existe pas). En fait ça sert uniquement à représenter une adresse où on ne sait pas ce qu'il y a, c'est donc surtout utilisé par les fonctions de manipulation de mémoire (malloc/free, memcpy), ou dans des cas particuliers comme dit 0².

Le type que tu donnes à ton pointeur dépend de ce que tu as l'intention de mettre dans ce buffer que tu as alloué. Dans certains cas, c'est plutôt la façon dont tu veux y accéder : typiquement, si tu veux représenter un plan de gris, c'est juste une série de bits, mais évidemment tu ne peux pas définir un pointeur vers des bits, donc le plus général c'est un pointeur vers des octets (unsigned char *). Si occasionnellement tu veux accéder à un mot, tu castes ponctuellement. Si tu n'y accèdes que via des mots, tu peux le définir comme unsigned short *, mais dans le cas de l'écran ça m'étonnerait que ce soit le cas, enfin j'en sais rien mais bon ^^.

Exemple :
unsigned char* buffer = qqch;
buffer[offset] = 0;
/* écrit l'octet 0 à l'adresse buffer + offset */
((unsigned short*) buffer)[offset] = 0;
/* écrit le mot 0 à l'adresse buffer + 2 x offset. Attention à ce facteur 2 ^^
edit : Kevin dit qu'il n'arrondit pas automatiquement à une adresse paire sad, donc attention aussi */

Bon par contre j'avais crossé et pas lu le ./66, ici si je comprends bien tu représentes un pixel sur 4 octets ? donc à ta place je définirais une structure :

typedef struct {
unsigned char red; /* oui j'écris n'importe quoi je sais pas comment marchent les niveaux de gris tongue */
unsigned char green;
unsigned char blue;
unsigned char alpha;
} pixel;

ensuite tu déclares ton pointeur comme un pixel*.
Après cela, pointeur[n] désigne la structure correspondant au pixel numéro n (donc le n+1e), c'est-à-dire en l'occurrence celle qui se trouve 4 x n plus loin que là où pointe le pointeur. De même, pointeur + n pointe vers cette structure numéro n, donc l'addition rajoute 4n à l'adresse effective.
Pour accéder aux composants individuels de ta structure, deux solutions :
— pointeur[n].green ou bien
— pointeur -> green (qui est une abréviation de (*pointeur).green)

Et ensuite ce que tu peux faire c'est remplacer le 4 dans l'argument de HeapAllocPtr par : sizeof(pixel). Quel est l'intérêt ? c'est que si plus tard tu t'aperçois que tu as besoin d'autres informations pour représenter un pixel, tu n'auras qu'à rajouter le composant à la structure, et tu n'auras pas à modifier cet appel, ni rien de ce qui n'utilise pas le nouveau composant. happy