matriz de longitud fija typedef

Resuelto 341008 asked hace 13 años • 7 respuestas

Tengo que definir un tipo de datos de 24 bits. Lo estoy usando char[3]para representar el tipo. ¿Puedo escribir definición char[3]en type24? Lo probé en un ejemplo de código. Puse typedef char[3] type24;mi archivo de encabezado. El compilador no se quejó de ello. Pero cuando definí 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)en lugar de type24_to_int32(char value[3]).

341008 avatar Dec 24 '10 07:12 341008
Aceptado

El tipo de definición sería

typedef char type24[3];

Sin embargo, esto probablemente sea una muy mala idea, porque el tipo resultante es un tipo de matriz, pero los usuarios no verán que es un tipo de matriz. Si se usa como argumento de función, se pasará por referencia, no por valor, y el sizeoffor será incorrecto.

Una mejor solución sería

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

Probablemente también quieras usarlo unsigned charen lugar de char, ya que este último tiene una firma definida por la implementación.

Quieres

typedef char type24[3];

Las declaraciones de tipo C son extrañas en ese sentido. Pones el tipo exactamente donde iría el nombre de la variable si estuvieras declarando una variable de ese tipo.

ysth avatar Dec 24 '2010 00:12 ysth

De la respuesta de R.. :

Sin embargo, esto probablemente sea una muy mala idea, porque el tipo resultante es un tipo de matriz, pero los usuarios no verán que es un tipo de matriz. Si se usa como argumento de función, se pasará por referencia, no por valor, y el tamaño de éste será incorrecto.

Los usuarios que no ven que es una matriz probablemente escribirán 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]);
}

Se 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
Gerhard Burger avatar Jun 04 '2014 11:06 Gerhard Burger