Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 07.05.2014
Сообщений: 44
1

Создать структуру, которая будет включать в себя какой-то набор структур-компонент

11.07.2014, 15:23. Просмотров 702. Ответов 8
Метки нет (Все метки)


Всем привет!

Есть несколько структур-компонент, выбор структуры зависит от некоторого условия (от флага 1/2/3...)

Реально ли в самой программе создать структуру, которая будет включать в себя какой-то набор структур-компонент, соответствующий значению флага?

Пример:
Если первый байт заголовка файла = 1, то в структуре должны быть структура "Время", "Имя", а если = 2, то "Время", "ФИО", "Количество строк"
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.07.2014, 15:23
Ответы с готовыми решениями:

Создать к базе данных форму, которая будет включать и запросы и добавление записей в таблицу
Помогите создать к базе данных форму, которая будет включать и запросы и добавление записей в...

как создать программу которая будет себя копировать?
//????????????

Сконструировать простой калькулятор который будет включать в себя следующие элементы
Сконструировать простой калькулятор, который будет включать в себя следующие управляющие элементы: ...

Как создать программу, которая будет записывать себя в автозагрузку?
как зделать чтобы прога при запуске записывала себя в автозагрузку

8
2706 / 1875 / 554
Регистрация: 05.06.2014
Сообщений: 5,447
11.07.2014, 16:14 2
Реально создать объект который будет помнить какая конкретно структура в нем лежит (ФИО/время/объем) и ругаться матом если в нем лежит одно, а просят другое. Доступ ко всем данным придется делать только через методы класса. Реализация в простейшем случае - в объект пихаются все возможные структуры разом, методы доступа проверяют флаг "что конкретно здесь лежит" и в случае если во флаге что-то не то - кидают исключение.
Если первый байт заголовка файла = 1, то в структуре должны быть структура "Время", "Имя", а если = 2, то "Время", "ФИО", "Количество строк"
Эту логику тоже можно упрятать внутрь класса, но надо смотреть чем конкретно вы пытаетесь читать файл.
0
27 / 26 / 16
Регистрация: 02.12.2013
Сообщений: 79
11.07.2014, 16:28 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct B1{};
struct B2{};
struct B3{};
 
struct A
{
    int type;
    union structs
    {
        B1 b1;
        B2 b2;
        B3 b3;
    };
 
};
Со словом "создание" надо быть аккуратнее. Оно тебя заведет к "фабрикам"...
0
2706 / 1875 / 554
Регистрация: 05.06.2014
Сообщений: 5,447
11.07.2014, 16:30 4
union годится только пока у B1, B2, B3 тривиальные конструкторы и деструкторы. Иначе сюрприз будет.
0
846 / 777 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
11.07.2014, 16:45 5
Цитата Сообщение от ioscat Посмотреть сообщение
Если первый байт заголовка файла = 1, то в структуре должны быть структура "Время", "Имя", а если = 2, то "Время", "ФИО", "Количество строк"
Можно, конечно, сделать различные структуры на каждый из вариантов заголовка файла, но это будет сложнорасширяемое решение.

Как мне кажется, можно сделать так: (приблизительно)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef std::vector<std::string> DataContainer;
typedef std::map<string, DataContainer> DataTable;
DataTable table;
// ...
// чтение файла
if (first_byte == 1)
{
    table["Время"] = DataContainer();
    table["Имя"] = DataContainer();
    // заполнение данными
} else if (first_byte == 2)
{
    table["Время"] = DataContainer();
    table["ФИО"] = DataContainer();
    table["Количество строк"] = DataContainer();
    // заполнение данными
}
Но всё зависит от того, что нужно получить в итоге.
0
27 / 26 / 16
Регистрация: 02.12.2013
Сообщений: 79
11.07.2014, 16:45 6
Цитата Сообщение от Renji Посмотреть сообщение
union годится
в рамках сформулированного вопроса, большего не требуется

А для более красивых решений, с привлечением мудрости "четырех", надо больше контекста и требований
0
1 / 1 / 1
Регистрация: 07.05.2014
Сообщений: 44
11.07.2014, 19:01  [ТС] 7
Так, попробую более точно сказать, что мне нужно:

Есть данные в виде
dataFlag 3 bytes
timecode 4 bytes
dataID 3 bytes
data *
- if data[0] = 0
- - 1 byte
- if data[0] = 1
- - dataSize 2 bytes
- - dataCode 1 byte
-if data[0] = 2
- - dataSize 2 bytes
- - dataValue 4 bytes

То есть от того, какие флаги стоят в полях, меняется состав сообщения.
0
27 / 26 / 16
Регистрация: 02.12.2013
Сообщений: 79
11.07.2014, 19:45 8
Цитата Сообщение от ioscat Посмотреть сообщение
меняется состав сообщения.
Ну раз о создание структур теперь речи не идет, то тогда только описания под разные "составы".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
struct s0
    {       
        unsigned char empty;
    };
    struct s1
    {
        unsigned short dataSize;
        unsigned char dataCode;
    };
 
    struct s2
    {
        unsigned short dataSize;
        unsigned char dataValue;
    };
 
    struct super
    {
        unsigned char dataFlag[3];
        unsigned int timecode;
        unsigned char dataID[3];
        unsigned char dataflag;
        union data
        {
            s0 s_o;
            s1 s_1;
            s2 s_2;
        };
    };
а для работы с сообщением
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void *message;
    super *pSuper = (super*)message;
 
    switch (pSuper->unionDataflag)
    {
    case 0:
        std::cout<<pSuper->data.s_o.empty;
        break;
    case 1:
        std::cout<<pSuper->data.s_1.dataSize<<"\t"<<pSuper->data.s_1.dataCode;
        break;
    case 2:
        std::cout<<pSuper->data.s_2.dataSize<<"\t"<<pSuper->data.s_2.dataValue;
        break;
    default:
        std::cout<<"shit happend";
    }
0
1 / 1 / 1
Регистрация: 07.05.2014
Сообщений: 44
14.07.2014, 09:30  [ТС] 9
Спасибо, наверное, это то, что нужно =)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2014, 09:30

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Создать строку, которая будет содержать набор символов содержащихся в файле
Открыть файл, имя которого задается с клавиатуры. Создать строку, которая будет содержать набор...

Создать строку, которая будет содержать набор символов содержащихся в файле
8. Открыть файл, имя которого задается с клавиатуры. Создать строку, которая будет содержать набор...

Создать строку, которая будет содержать набор символов содержащихся в файле
Открыть файл, имя которого задается с клавиатуры. Создать строку, которая будет содержать набор...

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


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

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

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