C méthode d'itération sur une struct membres comme un tableau?
Disons que j'ai une classe vector:
typedef struct vec3_s
{
float x, y, z;
}
vec3;
Mais, je voudrais être en mesure d'itérer dessus sans convertir un tableau de float. Alors qu'un casting est acceptable dans ce cas, je suis curieux de voir si quelque chose le long des lignes de C++ comme fonctionnalité est faisable en droit C. Par exemple, en C++, car std::vector< T >
a l'indice []
opérateur surchargé, je peux passer l'adresse de son premier indice d'une fonction prenant un void*
.
c'est à dire,
void do_something_with_pointer_to_mem( void* mem )
{
//do stuff
}
int main( void )
{
std::vector< float > v;
//fill v with values here
//pass to do_something_with_pointer_to_mem
do_some_with_pointer_to_mem( &v[ 0 ] );
return;
}
Un autre, plus concrète, par exemple, lorsque les appels à glBufferData(...) sont fait en OpenGL (lors de l'utilisation de C++):
glBufferData( GL_ARRAY_BUFFER, sizeof( somevector ), &somevector[ 0 ], GL_STREAM_DRAW );
Donc, est-il possible de réaliser quelque chose de similaire en C à l'aide de l'indice de l'opérateur? Si non, et j'ai dû écrire une fonction (par exemple, float vec3_value_at( unsigned int i )
), serait-il judicieux de simplement static inline
dans le fichier d'en-tête est défini dans?
- Double Possible de une Itération sur un même type struct membres en C
Vous devez vous connecter pour publier un commentaire.
Si tous vos champs de structure sont du même type, vous pouvez utiliser un syndicat comme suit:
De cette façon, vous pouvez accéder à chaque x, y ou z champ de façon indépendante ou itérer sur eux à l'aide de la vect3_a tableau. Cette solution ne coûte rien en terme de mémoire ou de calcul, mais on peut être un peu loin du C++ comme solution.
Vous n'obtenez pas le sucre syntaxique du C++, mais il est facile d'écrire la fonction que vous voulez écrire en C++ en tant qu'opérateur[].
Maintenant, vous pouvez parcourir toute vec3.
static
,inline
, ou une combinaison des deux?static
serait lui donner statique, plutôt que de portée globale (donc je ne comprends pas pourquoi vous pensez que ce serait une bonne).inline
serait un potentiel d'optimisation, mais vous auriez besoin de profil.Le problème en C avec ce que vous essayez de faire est que vous avez besoin de savoir comment se déplacer dans une structure (c'est à dire vous avez besoin de connaître le type). La raison
std::vector<T>
fonctionne comme il le fait c'est parce que c'est à l'aide de modèles (unC++
concept). Maintenant, cela dit, vous pouvez essayer quelque chose de légèrement différent de ce que vous avez suggéré. Si vous ne souhaitez pas utiliser les tableaux, vous pouvez stocker des types génériques. Cependant, lors de la récupération des données et de l'utilisation, l'utilisateur devra savoir quel type de données qu'il ou elle attend. Ci-dessous évite les tableaux (bien que, potentiellement plus propre solution existe dans leur utilisation) et a une liste liée de mise en œuvre de quelque chose qui vous donne presque la même souplesse destd::vector<T>
(avantages de performance de côté puisque c'est une liste liée avecO(n)
opérations pour tout (vous pouvez être intelligent et d'inverser la liste pour atteindre, peut-être,O(1)
insérer, mais c'est simplement pour l'exemple)Ce code doit compiler droit hors de la boîte. Ce que vous avez ici est une liste chaînée qui est de votre "vecteur" (en particulier, un vec3 structure). Chaque nœud dans la liste (c'est à dire de chaque élément dans le
std::vector<T>
sens) a 3 éléments qui sont tousvoid
pointeurs. Ainsi, vous pouvez stocker tout type de données que vous souhaitez ici. Le seul hic, c'est que vous avez besoin d'allouer de la mémoire pour ces pointeurs à point et lors de la suppression d'un élément, vous devez libérer de la mémoire (reportez-vous à lavec3_destroy
méthode pour un exemple). Espérons que cela aide un peu plus pour comprendre comment ces pointeurs void peut fonctionner dans votre cas.Pour récupérer les données, vous ne serez pas en mesure d'utiliser le
[]
la notation, mais vous pouvez utiliser levec3_get
méthode de la même manière. Ledo_something
méthode est un exemple de stub de quelque façon que vous pouvez être en mesure d'accomplir quelque chose de semblable à ce que vous avez mentionné dans l'OP.