Разный тип данных в массиве структур

Тема в разделе "Arduino & Shields", создана пользователем vector99, 24 янв 2018.

  1. vector99

    vector99 Гик

    Для примера такой код:
    Код (C++):
    // Это все параметры которые можем менять в меню
    int Null = 0;       // Этот параметр как заглушка, если менять нечего, костыль конечно ...
    int DateDay ;
    int DateMonth ;
    int DateYear ;        
    int TimeHour ;
    int TimeMin ;
    int TimeSecond ;

    typedef struct _value{
        int &param;                // Ссылка на переменную значения
        int minVal;                // Минимальное значение
        int maxVal;                   // Максимальное значение
    } VALUE;

    // Тип структуры данных описывающих пункт меню
    typedef struct _MenuItem {
        String title;            // Имя меню
        void(*on_click)(int);    // Ссылка на функцию вызова обрабоки изменения значения, параметр +1 или -1)
        VALUE *val;  
        char format[10];        // Формат вывода значения переменной
    } MenuItem;

    VALUE Date_[]={
           {DateDay,1,31},
           {DateMonth,1,12},
           {DateYear,0,99},
           {TimeHour,0,24},
           {TimeMin,0,60}
    };

    // Меню, первый пункт это не параметр, а просто выход с сохранением
    MenuItem MenuItems[] = {
        { "Date Day   ", Settings,       Date_,           "%02d" },
        { "Date Mount ", Settings,       Date_,           "%02d"  },
        { "Date Year  ", Settings,     Date_,          "20%02d" },
        { "Time Hour  ", Settings,       Date_,      "%02d" },
        { "Time Min   ", Settings,     Date_,            "%02d" }

    void Settings(int Concat) {
      MenuItems[MenuCurent].val[MenuCurent].param = constrain(MenuItems[MenuCurent].val[MenuCurent].param + Concat, MenuItems[MenuCurent].val[MenuCurent].minVal, MenuItems[MenuCurent].val[MenuCurent].maxVal);
    };
    Мне нужно хранить в массиве структур переменные типа "float" и "int", типа так:

    Код (C++):
    // Это все параметры которые можем менять в меню
    int Null = 0;       // Этот параметр как заглушка, если менять нечего, костыль конечно ...
    int DateDay ;
    float DateMonth ;       //тип float
    int DateYear ;            //тип int
    float TimeHour ;        //и.т.д
    int TimeMin ;
    float TimeSecond ;
    Но в структуре чётко определён тип данных который используем:
    Код (C++):
    int &param;  //вот здесь вся загвоздка (какой параметр определили такой и используем)
    В инете нагуглил что есть объединение "union", но реализовать не хватает ума. Да и в некоторых статьях пишут что "union" в С++ не работает.
    Если както можно реализовать прошу помочь, заодно разъяснить!
     
  2. DIYMan

    DIYMan Guest

    Выкиньте эти "некоторые статьи". Работает union, ещё как.
     
  3. vector99

    vector99 Гик

    Ткните носом.
    Если делаю так:
    Код (C++):
    typedef struct _value{
        union {
           int ival;
           float fval;
           }&param;
        //int &param;                // Ссылка на переменную значения
        int minVal;                // Минимальное значение
            int maxVal;                   // Максимальное значение
    } VALUE;

    VALUE Date_[]={
           {DateDay.ival,1,31},
           {DateMonth.ival,1,12},
           {DateYear.ival,0,99},
           {TimeHour.ival,0,24},
           {TimeMin.ival,0,60}
    };
    рагается
    Код (Text):


    sketch_jan13a.ino:48:25: error: request for member 'ival' in 'DateDay', which is of non-class type 'int'

    sketch_jan13a.ino:49:19: error: request for member 'ival' in 'DateMonth', which is of non-class type 'int'

    sketch_jan13a.ino:50:18: error: request for member 'ival' in 'DateYear', which is of non-class type 'int'

    sketch_jan13a.ino:51:18: error: request for member 'ival' in 'TimeHour', which is of non-class type 'int'

    sketch_jan13a.ino:52:17: error: request for member 'ival' in 'TimeMin', which is of non-class type 'int'

    Ошибка компиляции.
     
     
  4. DIYMan

    DIYMan Guest

    Если хотите заморочиться - посмотрите, как реализована структура VARIANT в Windows API. Касательно вашего подхода:

    Код (C++):
    typedef union
    {
      int ival;
      float fval;
    } VALUE_UNION;
    VALUE_UNION Null = {0};       // Этот параметр как заглушка, если менять нечего, костыль конечно ...
    VALUE_UNION DateDay ;
    VALUE_UNION DateMonth ;       //тип float
    VALUE_UNION DateYear ;            //тип int
    VALUE_UNION TimeHour ;        //и.т.д
    VALUE_UNION TimeMin ;
    VALUE_UNION TimeSecond ;

    typedef enum
    {
      vtFloat,
      vtInteger
     
    } VALUE_TYPE;

    typedef struct _value{
           VALUE_TYPE vt;
           VALUE_UNION &param;
            int minVal;                // Минимальное значение
            int maxVal;                   // Максимальное значение
    } VALUE;

    VALUE Date_[]={
           {vtInteger,DateDay,1,31},
           {vtFloat,DateMonth,1,12},
           {vtInteger,DateYear,0,99},
           {vtInteger,Null,24},
           {vtInteger,Null,60}
    };
     
    Тут есть и запоминание, на какой элемент union ссылаемся ( VALUE_TYPE), и ссылка на union. Но я уверен, что вашу задачу можно решить гораздо проще, вы зря так заморочились.
     
    arkadyf и vector99 нравится это.
  5. vector99

    vector99 Гик

    Спасибо большое. Может и по другому решу эту задачу. Я лучше ещё подумаю перед тем как применить "union" . Респект Вам за разжованный код!
     
  6. DIYMan

    DIYMan Guest

    Да незчт, обращайтесь ;)