est possible de typdef un tableau?
J'ai un ensemble de fonction vectorielle qui accepte tous un pointeur sur un flotteur qui est un tableau de trois flotteurs. Je peux tapedef float * Vec3_t, mais cela ne me permettra pas de créer un objet en le réglant simplement égal à un tableau entre parenthèses. P>
typedef float* vec3_t;
vec3_t a = {1,1,1}; // Does not work
vec3_t b = (float[]){1,1,1}; // Works
float c[] = {1,1,1}; // Works
void f(vec3_t x);
f({1,1,1}); // Error
f((float[]){1,1,1}; // OK
3 Réponses :
Un pointeur et un tableau ne sont pas la même chose. Bien qu'ils se comportent souvent de la même manière, il existe des différences majeures, dont une fois que vous venez de découvrir.
J'ai substitué le type Typefed avec type réel, pour faire Explication plus claire. p>
Vous avez simplement créé et initialisé un tableau P> < p> Le code ci-dessus n'est ni un lvalue ni une rvalue. Le ici Vous avez créé et initialement initialisé un tableau et alors fort> stocké son emplacement dans un pointeur . p> Ce cas est identique à celui ci-dessus, mais au lieu de stocker le pointeur que vous transmettez comme une dispute à une fonction. p> Vous essayez de Écrivez trois variables à un emplacement de mémoire qui n'est pas encore attribué.
En général, Bien que je comprends ce que vous vouliez réaliser, vous semblez oublier tout le concept de mémoire et de pointeurs. Imaginez ce code, qui (dans une logique sale) est un équivalent de ce que vous essayez de faire: p> Qu'est-ce qui se passerait si vous exécutez ce code? P > Alors maintenant, vous savez pourquoi le compilateur interdit. P> p> float c [] = {1,1,1}; code> p> f ({1,1,1}); code> p> {VAL1, ..., VALN} CODE> Syntaxe est rien de plus qu'un initialiseur em> et ne peut pas être utilisé autrewehere. P> flotteur * b = (float []) {1,1,1}; code> p> f ((float []) {1,1,1}; code> p> float * a = {1,1,1}; code> p> {valn, ..., valn} code> est un initialiseur. À ce moment, vous n'avez rien à initialiser. Par conséquent, cette syntaxe n'est pas valide. Vous essayez de verser du gaz dans un cartouche qui n'a pas encore été fabriqué. P>
doit noter que (flotteur []) {1,1,1} code> est une nouvelle syntaxe C99
Un tableau n'est pas un pointeur. Un tableau a em> un pointeur de base. Mais de toute façon, la structure de données la plus applicable pour ce que vous essayez d'atteindre serait quelque chose comme: Les matrices sont pratiques pour des structures de longueur variable et des objets, mais pas le choix le plus efficace depuis que vous savez Vous avez 3 flotteurs et vous pouvez exploiter cela. Permet au compilateur emballant de manière efficace votre structure et allouer du tas suffisamment de quoi vous avez besoin. P> P>
Vous devez avoir à de nombreuses fonctionnalités différentes emboutées dans votre code, ce n'est donc pas clairement clair ce que vous entendez par «pourquoi cela fonctionne de cette façon». Qu'est-ce que "ceci" spécifiquement?
Quoi qu'il en soit, afin de "Typedef un tableau", vous devez taper un tableau, pas le pointeur p> après lequel vous pourrez DO P> f((float []) { 1, 1, 1 });
Son problème semble être qu'il pense {1,1,1} est un tableau.
Notez que
Typedef float * Vec3_T code> est un pointeur, pas un tableau. Un tableau seraitTypedef float Vec3_T [3] code>. Les tableaux ne sont pas des pointeurs.Je pense que cela a quelque chose à voir avec la longueur des octets d'un flotteur. Char * fonctionne parce qu'un caractère est 1 octet. Mais 1 flotteur est ... 4 octets? pas sûr que
Je pense que le titre n'a pas grand chose à faire avec votre question actuelle. S'il vous plaît reformez-le.