Dans notre code, nous avons une grande structure de types mixtes, et voulons stocker une structure (const) en double de valeurs par défaut pour ceux-ci. Lorsque l'utilisateur souhaite définir un paramètre par défaut, il serait intéressant de le faire en prenant simplement le décalage d'adresse de l'élément dans la structure, puis d'affecter la valeur avec le même décalage dans les «valeurs par défaut» struct, un peu comme ceci:Est-ce que cela fonctionne avec les pointeurs void *? Si non, comment?
void *setting = &settings->thing; // Points to a setting
int offset = setting - &settings;
void *default = &defaults_struct + offset; // Points to the default value
*setting = *default; // Set setting to default value
l'idée étant que si Paramètres-> points de chose à un int8, la valeur de int8 est copié de défaut, mais si Paramètres-> other_thing est un int32, la pleine 32- les bits sont copiés.
La question est, est-ce que cela fonctionne avec les pointeurs de vide comme je l'ai décrit ci-dessus? Sinon, y a-t-il un moyen de le faire? Ai-je manqué un meilleur moyen d'y parvenir?
Modifier pour clarifier: Nous voulons définir une valeur unique dans la structure à la valeur correspondante dans la structure "defaults".
Pourquoi ne pas simplement 'settings-> thing = defaults_struct-> thing'? – interjay
Vous ne pouvez pas faire d'arithmétique de pointeur sur les pointeurs vides, et vous ne pouvez pas copier quoi que ce soit à travers cela. Vous devrez utiliser 'char *' et déterminer la longueur appropriée pour copier (et faire la copie vous-même). – Mat
Vous devez utiliser la macro 'offsetof' pour calculer un décalage. –