Скопировать несколько структурных данных в одну C структуру? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть несколько C структур различных типов данных, как определено ниже

typedef struct Particle_1
 {
  char   name[16];
  int    lati_1;
  int    longi_1;
  float  pressure_1;
  double temperature_1;
 } Particle_1;

typedef struct Particle_2
 {
  char   name[16];
  int    longi_2;
  float  pressure_2;
  double temperature_2;
 } Particle_2;

typedef struct Particle
 {
  char   name[16];
  int    lati_1;
  int    longi_1;
  float  pressure_1;
  double temperature_1;
  char   name[16];
  int    longi_2;
  float  pressure_2;
  double temperature_2;
 } Particle;

Теперь, каков наилучший способ скопировать данные из структур Particle_1 и Particle_2 в Particle без одного в одно назначение переменной? Кроме того, я не хочу определять структуру Particle как структуру Particle_1 и Particle_2

Ответы [ 2 ]

2 голосов
/ 23 марта 2020

Каков наилучший способ скопировать данные из структур Particle_1 и Particle_2 в Particle без однозначного присвоения переменной?

Не существует соответствующего механизма для этого с типами как Вы определили их.

Кроме того, я не хочу определять структуру Particle как структуру Particle_1 и Particle_2

Это, честно говоря, абсурдное ограничение. У вас есть одна структура данных, которая представляет собой совокупность данных двух других (и это немного больше, чем техническая составляющая того, что это две, а не одна и та же), и , вы хотите совместимость среди этих. Составная структура должна иметь другие элементы в качестве членов:

struct particle {
    char   name[16];
    int    lati;
    int    longi;
    float  pressure;
    double temperature;
};

struct two_particles {
    struct particle p1;
    struct particle p2;
};

(теги структуры изменены для ясности.) Обратите внимание, что для этого требуется только одна одночастичная структура, которую я ожидаю будет также преимуществом, и вы можете использовать структурное назначение для обновления одной половины и / или другой из struct two_particles:

struct particle particle1 = /* ... */;
struct particle particle2 = /* ... */;
struct two_particles pair;

pair.p1 = particle1;
pair.p2 = particle2;

... или даже ...

pair.p1 = pair.p2;

Между прочим, между ними нет псевдонимов.

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

struct two_particles_mix {
    union {
        struct particle p1;
        struct {
            char   name_1[16];
            int    lati_1;
            int    longi_1;
            float  pressure_1;
            double temperature_1;
        };
    };
    union {
        struct particle p2;
        struct {
            char   name_2[16];
            int    lati_2;
            int    longi_2;
            float  pressure_2;
            double temperature_2;
        };
    };
};

При этом вы получаете оба подхода в одном:

struct two_particles_mix pair2;

pair2.p1 = particle1;
pair2.p2 = particle2;
int lati1 = pair2.lati_1;
double pressure2 = pair2.pressure_2;
0 голосов
/ 23 марта 2020

Как указал @mch, у вас есть два поля с именем name в Частице. Предположим, что вы готовы переименовать второе имя в name_2, это должно сработать. У меня нет доступа к компилятору в данный момент, поэтому не могу проверить, но это укажет вам правильное направление:

Particle_1 p1;
Particle_2 p2;
Particle_1 p;

memcpy(&p, &p1, sizeof(p1));
memcpy(&p.name_2, &p2, sizeof(p2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...