C ++ - члены общей структуры дают неправильные значения при присваивании значений типа double (но отлично работают с целыми числами) - PullRequest
0 голосов
/ 25 января 2019

У меня есть общая структура, подобная следующей (внутри общего шаблона):

struct AY_ALIGN(64) {
    T parm1;
    T parm2;
    T parm3;
    T parm4;
    T parm5;
};

Когда я назначаю членов с целыми числами, вывод правильный:

pr->u.p.parm1 = 0;
pr->u.p.parm2 = 2;
pr->u.p.parm3 = 1;
pr->u.p.parm4 = 1;
pr->u.p.parm5 = 1;

printf("The values: parm1=%i, parm2=%i, parm3=%i, parm4=%i, parm5=%i.\n",
        pr->u.p.parm1,
        pr->u.p.parm2,
        pr->u.p.parm3,
        pr->u.p.parm4,
        pr->u.p.parm5);

Функция printf () дает правильные значения.

Проблема возникает при использовании удваивается следующим образом:

*(double *)&pr->u.p.parm1 = 1.0;
*(double *)&pr->u.p.parm2 = 2.0;
*(double *)&pr->u.p.parm3 = 1.0;
*(double *)&pr->u.p.parm4 = 1.0;
*(double *)&pr->u.p.parm5 = 1.0;

printf("The values: parm1=%f, parm2=%f, parm3=%f, parm4=%f, parm5=%f.\n",
        *(double *)&pr->u.p.parm1,
        *(double *)&pr->u.p.parm2,
        *(double *)&pr->u.p.parm3,
        *(double *)&pr->u.p.parm4,
        *(double *)&pr->u.p.parm5);

Вывод здесь:

parm1=0.000000
parm2=0.000000
parm3=0.000000
parm4=0.000000
parm5=1.000000

И при использовании других чисел, таких как parm4 = 0.8754 (просто пример), вывод меняется на очень странный:

parm1=1.000000
parm2=0.000000
parm3=-85443653999189573105674489609599978349239364506618107894018364220379126235920356559839098648677109228247196955211621648453249973580988416.000000
parm4=0.000000
parm5=1.000000

Есть идеи, что мне здесь не хватает?

1 Ответ

0 голосов
/ 26 января 2019

Хорошо, я обнаружил проблему ... Поскольку double занимает больше места, чем целое число, он занимает два члена структуры одновременно (это может зависеть).Мои возможности состоят в том, чтобы либо использовать структуру с неназначенным следующим членом (пробел) (что является очень плохой идеей, хотя она будет работать нормально на моей машине):

struct AY_ALIGN(64) {
    T parm1;
    T parm2;
    T parm3;
    T parm4;
    T parm5;
};
*(double *)&pr->u.p.parm1 = 1.0;
//*(double *)&pr->u.p.parm2 = 2.0; // Do not assign parm2
*(double *)&pr->u.p.parm3 = 1.0;
//*(double *)&pr->u.p.parm4 = 1.0; // Do not assign parm4
pr->u.p.parm5 = 1; // Only space for an integer...

Или использовать, как вы, ребята, упомянули(вторая) структура с правильным типом, подобным этому (что является лучшим решением):

struct AY_ALIGN(64) {
    double parm1;
    double parm2;
    double parm3;
    double parm4;
};
...