c - tipos - array de longitud fija typedef
typedef en programaciĆ³n (5)
Tengo que definir un tipo de datos de 24 bits. Estoy usando char[3]
para representar el tipo. ¿Puedo escribirdedef char[3]
a type24
? Lo intenté en una muestra de código. Puse typedef char[3] type24;
en mi archivo de encabezado El compilador no se quejó de eso. Pero cuando void foo(type24 val) {}
una función void foo(type24 val) {}
en mi archivo C, se quejó. Me gustaría poder definir funciones como type24_to_int32(type24 val)
lugar de type24_to_int32(char value[3])
.
De la respuesta de R ..
Sin embargo, esta es probablemente una muy mala idea, porque el tipo resultante es un tipo de matriz, pero los usuarios no verán que sea un tipo de matriz. Si se usa como un argumento de función, se pasará por referencia, no por valor, y el tamaño de la misma será incorrecto.
Los usuarios que no vean que es una matriz probablemente escriban algo como esto (que falla):
#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]);
}
Compilará con las siguientes advertencias:
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);
^
Y produce el siguiente resultado:
0
1
-453308976
32767
El typedef sería
typedef char type24[3];
Sin embargo, esta es probablemente una muy mala idea, porque el tipo resultante es un tipo de matriz, pero los usuarios no verán que sea un tipo de matriz. Si se usa como un argumento de función, se pasará por referencia, no por valor, y el sizeof
de la misma será incorrecto.
Una mejor solución sería
typedef struct type24 { char x[3]; } type24;
Probablemente también desee utilizar unsigned char
lugar de char
, ya que este último tiene unsigned char
la implementación.
Las matrices no se pueden pasar como parámetros de función por valor en C.
Puedes poner la matriz en una estructura:
typedef struct type24 {
char byte[3];
} type24;
y luego pase eso por valor, pero por supuesto, entonces es menos conveniente usar: x.byte[0]
lugar de x[0]
.
Su función type24_to_int32(char value[3])
realidad pasa por puntero, no por valor. Es exactamente equivalente a type24_to_int32(char *value)
, y el 3
se ignora.
Si está contento pasando el puntero, puede quedarse con la matriz y hacer:
type24_to_int32(const type24 *value);
Esto pasará un puntero a matriz, no puntero-a-primer elemento, por lo que lo usa como:
(*value)[0]
No estoy seguro de que sea realmente una ganancia, ya que si accidentalmente escribes value[1]
entonces sucede algo estúpido.
Para usar el tipo de matriz correctamente como argumento de función o parámetro de plantilla, cree una estructura en lugar de un typedef, luego agregue un operator[]
a la estructura para que pueda mantener la funcionalidad similar a la matriz de la siguiente manera:
typedef struct type24 {
char& operator[](int i) { return byte[i]; }
char byte[3];
} type24;
type24 x;
x[2] = ''r'';
char c = x[2];
Usted quiere
typedef char type24[3];
Las declaraciones de tipo C son extrañas de esa manera. Coloca el tipo exactamente donde iría el nombre de la variable si estuviera declarando una variable de ese tipo.