242 votes

tableau de longueur fixe typedef

Je dois définir un type de données 24 bits. J'utilise char[3] pour représenter le type. Puis-je taper char[3] à type24 ? Je l'ai essayé dans un exemple de code. Je mets typedef char[3] type24; dans mon fichier d'en-tête. Le compilateur ne s'en est pas plaint. Mais lorsque j'ai défini une fonction void foo(type24 val) {} dans mon fichier C, elle s'est plaint. Je voudrais pouvoir définir des fonctions comme type24_to_int32(type24 val) au lieu de type24_to_int32(char value[3]) .

368voto

R.. Points 93718

Le typedef serait

typedef char type24[3];

Cependant, c'est probablement une très mauvaise idée, parce que le type obtenu est de type tableau, mais les utilisateurs de ne pas voir que c'est un type tableau. Si elle est utilisée comme un argument de fonction, il sera passé par référence et non par valeur, et l' sizeof pour les il sera alors mal.

Ce serait une meilleure solution

typedef struct type24 { char x[3]; } type24;

Vous avez sans doute aussi veulent être l'aide d' unsigned char au lieu de char, puisque ce dernier a la mise en œuvre définie par ce paramètre.

58voto

ysth Points 54757

Tu veux

 typedef char type24[3];
 

Les déclarations de type C sont étranges.

37voto

Gerhard Burger Points 322

De R..'s réponse:

Cependant, c'est probablement une très mauvaise idée, parce que le type résultant est de type tableau, mais les utilisateurs de ne pas voir que c'est un type tableau. Si elle est utilisée comme un argument de fonction, il sera passé par référence, non pas par valeur, et la sizeof pour il sera alors mal.

Les utilisateurs qui ne voient pas que c'est un tableau sera très probablement écrire quelque chose comme ceci (qui échoue):

#include <stdio.h>

typedef int twoInts[2];

void print(twoInts *twoIntsPtr);
void intermediate (twoInts twoIntsAppearsByValue);

int main () {
    twoInts a;
    a[0] = 0;
    a[1] = 1;
    print(&a);
    intermediate(a);
    return 0;
}
void intermediate(twoInts b) {
    print(&b);
}

void print(twoInts *c){
    printf("%d\n%d\n", (*c)[0], (*c)[1]);
}

Compiler avec les avertissements suivants:

In function ‘intermediate':
warning: passing argument 1 of ‘print' from incompatible pointer type [enabled by default]
    print(&b);
     ^
note: expected ‘int (*)[2]' but argument is of type ‘int **'
    void print(twoInts *twoIntsPtr);
         ^

Et produit la sortie suivante:

0
1
-453308976
32767

17voto

Steve Jessop Points 166970

Les tableaux peuvent pas être transmis en fonction de paramètres par valeur en C.

Vous pouvez mettre le tableau dans une structure (struct):

typedef struct type24 {
    char byte[3];
} type24;

et puis passer que par la valeur, mais bien sûr, alors il est moins pratique à utiliser: x.byte[0] au lieu de x[0].

Votre fonction type24_to_int32(char value[3]) passe par pointeur, et non par valeur. C'est exactement équivalente à type24_to_int32(char *value), et l' 3 est ignoré.

Si vous êtes heureux de passage par pointeur, vous pourrait coller avec le tableau et faire:

type24_to_int32(const type24 *value);

Cela permettra de passer un pointeur de tableau, pas de pointeur vers du premier élément, de sorte que vous l'utiliser comme:

(*value)[0]

Je ne suis pas sûr que ce soit vraiment un gain, car si vous avez accidentellement écrire value[1] alors quelque chose de stupide qui se passe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X