Форум программистов, компьютерный форум, киберфорум
Наши страницы
С под Linux
Войти
Регистрация
Восстановить пароль
 
Pink_Pank
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
1

Получить тип не созданной переменной. Работа с полями структуры

21.08.2017, 13:56. Просмотров 280. Ответов 6
Метки нет (Все метки)

Всем здрям!

Имеется определение структуры в хедере, например:
C++
1
2
3
4
5
typedef struct {
    char  a;
    int   b;
    float c;
} abc_S;
и есть код в другом файле, который ее использует.

Причем, задача написать код универсально,
чтобы при изменении размера членов структуры в хедере (например, был char a, стал int a)
сам код необходимо было менять минимально (в идеале не менять вообще).
Приходит массив байт, мне его надо распарсить.
А там встречаются члены данной структуры.

Пока додумался до вот этого:

C++
1
2
3
4
5
6
7
uint8_t byteArray[64]; // буфер для моих данных
 
abc_S *pAbc;            // для __typeof__. 
// Использован указатель, чтобы не выделять много памяти под всю структуру.
typedef __typeof__(pAbc->a) aType;
 
aType otherA = *(     (aType *)byteArray     );
Можно это изобразить как-то более красиво, без создания указателей и др неиспользуемых переменных?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2017, 13:56
Ответы с готовыми решениями:

Реализовать тип данных с помощью структуры с полями First и Second
Не могу разобратся со структурами((( А мне нада сделать задание... Потскажите хоть как нить, ...

Получить тип переменной и задать её переменной типа тип
то есть int A = 213213 Type B = A.GetType() - ну надо что-то вроде этого но для Type b =...

Как получить значение переменной созданной в потоке, в другом потоке?
Добрый день :) Возник такой вопрос "как получить значение переменной созданной в потоке, в другом...

Реализовать внешнюю функцию с именем make _ тип (), где тип — тип реализуемой структуры
Реализовать внешнюю функцию с именем make _ тип (), где тип — тип реализуемой структуры. Функция...

Как сохранить "тип" структуры в переменной
существует такая шняга: Read<Int64>(dwAddress) вот мне хотелось бы узнать, как менять Int64 на...

6
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4597 / 2887 / 2247
Регистрация: 22.11.2013
Сообщений: 8,058
21.08.2017, 16:29 2
Написанное выше вполне укладывается в
C
1
2
3
4
5
typedef struct my_t {
    char a;
    int b;
    float c;
} my_t;
C
1
2
3
4
5
uint8_t bytes[64];
my_t *p = bytes;
for (int i=0; i<2; ++p, ++i) {
    ... p->a ... p->b ... p->c ...
}
Добавлено через 3 минуты
так и без указателей:
C
1
2
3
4
my_t b[4];
for (int i=0; i<sizeof b / sizeof b[0]; ++i) {
    ... b[i].a ... b[i].b ... b[i].c ...
}
0
Pink_Pank
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
21.08.2017, 17:02  [ТС] 3
Эх, если б все было так просто..

Представьте, что мне нужно вычитать вот такую структуру:

C++
1
2
3
4
5
6
struct{
    anyType             x;
    __tipeof__(abc_S.a) y; // так писать низя, но нужна красивая альтернатива.
// где abc_S определена в старте топика
    anyType             z;
};
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4597 / 2887 / 2247
Регистрация: 22.11.2013
Сообщений: 8,058
21.08.2017, 17:29 4
Всё именно так просто:
C
1
2
3
4
5
6
typedef char some_a_t;
typedef struct my_t {
    some_a_t a;
    int b;
    float c;
} my_t;
C
1
2
3
4
5
struct {
    anyType x;
    some_a_t y;
    anyType z;
};
3
Pink_Pank
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
21.08.2017, 18:54  [ТС] 5
Хм.. интересное решение. Спасибо за идею. Жалко только, что если интенсивно юзать - будет большое нагромождение тайпдефов..
Да и код такой читать заколебаешься..
А что-то более комплексное? если, скажем у меня 10-к - другой таких переменных, но опять-таки вычитывать буду не всю структуру.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
4597 / 2887 / 2247
Регистрация: 22.11.2013
Сообщений: 8,058
22.08.2017, 10:29 6
Цитата Сообщение от Pink_Pank Посмотреть сообщение
опять-таки вычитывать буду не всю структуру
-- Доктор, когда я делаю вот так -- изгибается в немыслимой позе -- у меня вот тут колет.
-- А вы так не делайте.
(q) Анекдот

PS. Ежели что, в отношении структур есть еще выравнивание полей, которое тоже может сильно насолить.
0
Pink_Pank
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
22.08.2017, 11:34  [ТС] 7
Про выравнивание я в курсе. Они у меня все с атрибутом packed. А все-таки, идеи есть какие-то еще?
0
22.08.2017, 11:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2017, 11:34

Заполнение динамически созданной структуры
Дамы и господа. Укажите где косяк, пожалуйста, туплю в код над простенькой задачкой typedef struct...

Как для созданной таблицы изменить тип столбца
Где можно изменить тип данных таблицы в IBConsole

Как обратиться из потока 1 к переменной, созданной в потоке 2
Подскажите) не нагуглил


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru