resolvidos - vetor de struct em c




array de tamanho fixo typedef (4)

Eu tenho que definir um tipo de dados de 24 bits. Eu estou usando char[3] para representar o tipo. Posso digitar o char[3] em type24 ? Eu tentei em um exemplo de código. Eu coloquei typedef char[3] type24; no meu arquivo de cabeçalho. O compilador não se queixou disso. Mas quando eu defini uma função void foo(type24 val) {} no meu arquivo C, ela reclamou. Eu gostaria de poder definir funções como type24_to_int32(type24 val) vez de type24_to_int32(char value[3]) .


Arrays não podem ser passados ​​como parâmetros de função por valor em C.

Você pode colocar a matriz em uma estrutura:

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

e depois passar isso por valor, mas é claro que é menos conveniente usar: x.byte[0] vez de x[0] .

Sua função type24_to_int32(char value[3]) realmente passa pelo ponteiro, não pelo valor. É exatamente equivalente a type24_to_int32(char *value) e o 3 é ignorado.

Se você está feliz passando pelo ponteiro, você pode ficar com a matriz e fazer:

type24_to_int32(const type24 *value);

Isso passará um ponteiro para matriz, não um ponteiro para um primeiro elemento, então você o usa como:

(*value)[0]

Eu não tenho certeza se isso é realmente um ganho, já que se você acidentalmente escreve value[1] então algo estúpido acontece.


From R .. 's answer :

No entanto, esta é provavelmente uma ideia muito ruim, porque o tipo resultante é um tipo de matriz, mas os usuários dela não verão que é um tipo de matriz. Se usado como um argumento de função, ele será passado por referência, não por valor, e o tamanho de, então, estará errado.

Os usuários que não vêem que é uma matriz provavelmente escreverão algo assim (que falha):

#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]);
}

Ele irá compilar com os seguintes avisos:

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);
         ^

E produz a seguinte saída:

0
1
-453308976
32767

Para usar o tipo de matriz corretamente como um argumento de função ou parâmetro de modelo, faça uma struct em vez de um typedef, em seguida, adicione um operator[] à estrutura para que você possa manter a funcionalidade da matriz da seguinte forma:

typedef struct type24 {
  char& operator[](int i) { return byte[i]; }
  char byte[3];
} type24;

type24 x;
x[2] = 'r';
char c = x[2];

Você quer

typedef char type24[3];

Declarações de tipo C são estranhas assim. Você coloca o tipo exatamente onde o nome da variável iria se estivesse declarando uma variável desse tipo.







typedef