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])
.
Réponses
Trop de publicités?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.
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
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.