Переопределение типов с другой typedef - PullRequest
0 голосов
/ 05 июля 2011
typedef struct {
  unsigned char a,
  unsigned char b, 
  unsigned char c
}type_a;

typedef struct {
 unsigned char e,
 unsigned char f[2]
}type_b;

type_a sample;
sample.a = 1;
sample.b = 2;
sample.c = 3;

Как мне ввести его и назначить новое значение, например:

sample = (type_b)sample; // syntax error
sample.f[1] = 'a';

Ответы [ 5 ]

2 голосов
/ 05 июля 2011

Нет - типы C являются статическими, что означает, что sample всегда будет иметь тип type_a.Тем не менее, вы можете достичь того, что вы хотите, используя союзы:

union {
    type_a as_a;
    type_b as_b;
} sample;

sample.as_a.a = 1;
sample.as_a.b = 2;
sample.as_a.c = 3;

sample.as_b.f[1] = 'a';

Обратите внимание, что обычно не создается объект типа union, как этот;обычно вы включаете union в struct, который включает тег, чтобы вы знали, какой тип объекта в настоящее время:

struct {
    enum { TYPE_A, TYPE_B } type;
    union {
        type_a as_a;
        type_b as_b;
    } data;
} sample;

/* sample is a TYPE_A right now */
sample.type = TYPE_A;
sample.data.as_a.a = 1;
sample.data.as_a.b = 2;
sample.data.as_a.c = 3;

/* sample is now a TYPE_B */
sample.type = TYPE_B;
sample.data.as_b.f[1] = 'a';
2 голосов
/ 05 июля 2011

Вы действительно должны попробовать это сами.

sample = (type_b)sample; /* Can't cast a structure to
                            another structure. */

sample.f[1] = 'a'; /* sample is still of type type_a,
                      and doesn't have an `f` field. */
1 голос
/ 05 июля 2011

Нельзя привести один тип данных к другому несовместимому типу данных.Тем не менее, память открыта для вас.Вы можете получить к нему доступ следующим образом:

typedef struct
{
  unsigned char a;
  unsigned char b; 
  unsigned char c;
}type_a;

typedef struct
{
 unsigned char e;
 unsigned char f[2];
}type_b;

type_a sample;
sample.a = 1;
sample.b = 2;
sample.c = 3;

type_b *sample_b = (type_b *) ((void*) &sample);

Попробуйте сами получить доступ к sample_b->e и sample_b->f и посмотрите, что произойдет.

0 голосов
/ 08 июля 2011

да, вы можете скопировать значение type_a в type_b, попробовав что-то вроде

type_b sample_b = * ((type_b *) & sample);

или

memcpy(& sample_b, & sample, sizeof (type_a));

Typecasting - это не что иное, как преобразование выражения одного типа в другое.Но вы, похоже, пытаетесь преобразовать сам тип, который фиксируется во время компиляции (объявление переменной)

Не ясно, что стоит за попыткой чего-то подобного.Если вы сможете сделать это более понятным, люди смогут дать больше идей

0 голосов
/ 05 июля 2011

Нет. Вы можете сделать это, используя указатели: value_b = *((value_b*)&value_a) или создав объединение этих двух типов.

Как бы вы ни делали, будьте осторожны. Структуры могут иметь различное выравнивание данных, и вы можете получить неожиданные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...