Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
beam
0 / 0 / 0
Регистрация: 22.05.2015
Сообщений: 57
#1

Массив объектов с разными свойствами - C++

19.06.2016, 00:28. Просмотров 259. Ответов 9
Метки нет (Все метки)

Всем доброго дня!
На мк (stm32) у входов есть разные возможности.
Для меня интересны:
  1. Discrete
  2. Analog
  3. Frequency
  4. Counter
Не все входы обладают этими возможностями. Всего 24 входа. В моем случае только 4 могут считать кол-во импульсов и частоту. Я хочу создать общий класс для входов, в котором будет реализована защита по указанию типа входа. Сейчас у меня примерно так:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
namespace UcSystem
{   
    typedef enum class ChannelTypeT : byte // Определяет тип входа
    {
        Discrete,
        Analog,
        Frequency,
        Counter
    };
    
    typedef union ChannelData8T // Это вариант для хранения 1 байта
    {
        bool Discrete;
        byte Analog;
    };
 
    typedef union ChannelData16T // Тут для 12 бит ацп и счетчик/частота
    {
        bool Discrete;
        ushort Analog;
        ushort Frequency;
        ushort Count;
    };
    
    struct Channel8T // Здесь непосредственно весь канал в 1 байт
    {
        friend class Device; // Для доступа к isActive и к type - каналы могут быть не активны, настройка по условию
        ChannelData8T value;
        bool hasChanged;
        bool getActivity(){return isActive;};
    protected:
        bool isActive;
        ChannelTypeT type;
    };
 
    struct Channel16T // Тут в 2 байта
    {
        friend class Device;
        ChannelData16T value;
        bool hasChanged;
        bool getActivity(){return isActive;};
    protected:
        bool isActive;
        ChannelTypeT type;
    };
 
    class Device // класс устройства, в котором 24 канала
    {
    private:
        byte mGroup;
    public:
        Channel16T advancedInputChannel[4];// создаю для 4х каналов с частотой
        Channel8T inputChannel[20];// остальные обычные
        bool advancedInputChannelsNew,// флаги обновления данных в массивах
             inputChannelsNew;
 
        Device();
        void setGroup(byte value);
        byte getGroup();
        void setChannelActivity(byte channel, bool value);// тут активируется канал
        void setChannelType(byte channel, ChannelTypeT type);// тут указывается его тип
    };
}
 
...
Device own;
...
ushort temp = own.advancedInputChannel[0].value.Counter;// Так я читаю значение advanced канала
ushort tomp = own.inputChannel[4].value.Analog;// Так я читаю значение обычного канала
Я бы хотел объединить эти 2 массива структур, но так, что бы я не мог выбрать у каналов 4-23 (5-24) позиций Frequency и Counter, то есть:
C++
1
2
ushort temp = own.universalInputChannel[0].value.Counter;// Так я читаю значение счетчика
ushort temp = own.universalInputChannel[4].value.Counter;// Ошибка компиляции или что-нибудь такое...
И вопрос №2 - вы заметили, что есть возможность хранить значение каналов в 1 или 2 байтах. А есть ли возможность скомпоновать массив из 24 каналов, но не одного типа ChannelData**T. То есть к примеру 0-3 у меня будут 16 бит, а 4-23 8 бит, но все они будут в переменной Channel??T universalInputChannel[24];?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2016, 00:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив объектов с разными свойствами (C++):

Как создать массив видимый между разными void - C++ Builder
Ребят вот есть кусок: void TForm1::Pic(TObject *Sender) { TImage* MyCar={MyCar7,MyCar6,MyCar5,MyCar4,MyCar3,MyCar2,MyCar1}; }...

Массив структур объектов - C++ Builder
Доброго всем времени суток! Возник такой вопрос, имеется форма. Хочу чтобы на форме появилось 5 шейпов. Если делаю массив объектов то они...

Большой массив объектов - C++ Builder
Здравствуйте. Пишу простую игру, для этого нужно создать поле 46*59 из ячеек класса myCell. Однако чем больше размер поля, тем дольше оно...

Динамический массив объектов - C++ Builder
Всем здрасьте. Наверно где-то сильно туплю, но не могу найти, где. Имеется класс, конструктор пуст. Создаётся динамический массив...

Как в С++ объявить массив объектов? - C++ Builder
Всем привет! Есть 2 метода в классе, один возращает кол-во записей в таблице: int Department::getRowsCount(){ .... ...

Массив объектов на форме реагирует на клик - C++ Builder
Есть массив картинок рандомно раскиданных на форме. Как сделать так, чтобы при клике на одну из картинок, скажем, появлялось сообщение с...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
19.06.2016, 16:41 #2
beam, если это полноценный c++ то заведите базовый класс канал с методом обновить значение и наследников с методами обновить значение, получить значение, передать значение, настроить
0
beam
0 / 0 / 0
Регистрация: 22.05.2015
Сообщений: 57
19.06.2016, 19:23  [ТС] #3
это с++ с элементами с++11.
Если я создам базовый класс и наследников я все равно не смогу сделать массив с разными типами.
То есть я хочу сделать примерно так:
C++
1
2
3
InputChannelT inputChannel[24]; // Но так, что бы 0-3 были одного типа, а 4-23 другого.
temp ushort = inputChannel[0].value.Frequency; // тут все получится. inputChannel[0..3] типа, в котором есть Freq и Counter
temp ushort = inputChannel[7]. // Тут после нажатия точки в выпадающем меню даже не будет возможности выбрать Freq и Counter, потому что в их типе (inputChannel[4..23]) они отсутствуют
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
19.06.2016, 19:55 #4
beam, вы никогда не сможете оперировать базовыми объектами как производными без приведения типа, но обновлять сможете
0
beam
0 / 0 / 0
Регистрация: 22.05.2015
Сообщений: 57
19.06.2016, 21:29  [ТС] #5
понятно, так и думал. Жалко.
0
rao
853 / 406 / 119
Регистрация: 02.04.2014
Сообщений: 1,171
20.06.2016, 10:02 #6
В массив можно класть не сами объекты, а указатели на них.
А классам объектов добавить поле по которому можно определять их тип.
0
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
20.06.2016, 10:12 #7
rao, безусловно там должны быть только указатели - иначе виртуальные функции и не работают, но тс вообще хотел красоту - что бы в массиве были прямо разные объекты времени компиляции без приведения типа
0
rao
853 / 406 / 119
Регистрация: 02.04.2014
Сообщений: 1,171
20.06.2016, 10:58 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
аа . .понятно
тогда надо инкапсулировать доступ к членам классов что бы работать с ними полиморфно. Т.е. делать что-то типа:
C++
1
temp ushort = inputChannel[0].getValue( индекс_поля )
Но конечно пользы от этого будет мало. (ТСу видимо хочется взвалить на компилятор слежение за правильностью обращения с объектами, а тут этого не обеспечивается)

В .NET вроде бы такое можно делать. В C#
1
vxg
Модератор
3162 / 1965 / 220
Регистрация: 13.01.2012
Сообщений: 7,523
20.06.2016, 11:56 #9
beam, rao, как вариант
C++
1
2
3
4
5
6
7
8
template <class ch1_type, class ch2_type, class ch3_type>
class module_t
{
public:
    ch1_type ch1;
    ch2_type ch2;
    ch3_type ch3;
};
но на мой вкус это уродство
1
beam
0 / 0 / 0
Регистрация: 22.05.2015
Сообщений: 57
20.06.2016, 15:06  [ТС] #10
Цитата Сообщение от rao Посмотреть сообщение
ТСу видимо хочется взвалить на компилятор слежение за правильностью обращения с объектами
Абсолютно верно! Просто либа пишется для контроллера, а там последствия могут быть серьезнее, чем в софте. Мой случай, конечно, не такой, ибо читая из этого enum все равно получу "правильное" значение, но хотелось бы что бы было вообще сказка =) (это если весь массив одного типа).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2016, 15:06
Привет! Вот еще темы с ответами:

Динамический массив объектов работает 1 раз - C++ Builder
Здравствуйте, форумчане! class words { static char* poslednee; char word; bool chetnoe; public: static char*...

Создать массив объектов,а не указателей там где в программе рисуются центры фигур - C++ Builder
#include &lt;vcl.h&gt; #pragma hdrstop #include &quot;Unit1.h&quot; //--------------------------------------------------------------------------- ...

Как правильно создать массив объектов текущего класса в методе данного класса? - C++ Builder
Привет! Ставится задача создания метода, который формирует массив объектов. Правильно ли делать этот метод внутри класса, экземпляром...

Динамический массив объектов - Visual C++
как мне расположить динамический массив объектов Button так чтоб я из разный функций (функция принадлежащих пространству проекта ) мог...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.06.2016, 15:06
Ответ Создать тему
Опции темы

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