Инструкция C Switch для присвоения значений структуры

#c #struct #switch-statement

Вопрос:

*Я пытаюсь присвоить одному объекту структуры значения из другой структуры для любого типа птиц, выбранного с помощью оператора switch. Однако я получаю conflicting decoration ошибку. Как я могу это решить?

    /**
   temp and humidity control points
*/
struct chicken_config
{
  char *node_type = "incubator";
  char *sub_type = "chicken";       // set the type of incubator
  int sub_type_id = 1;
  int hot = 102;                //set hot parameter
  float optimum_temp = 99.5;    // set optimum_temp temp to go to b4 turning off
  float cold = 89.9;            //set cold parameter
  int high_hum = 65;            //set high humidity parameter
  int optimum_hum = 60;         // set optimum humidity parameter to go to b4 turning off
  int low_hum = 55;             // set low humidity parameter
};

struct turkey_config
{
  char *node_type = "incubator";
  char *sub_type = "turkey";        // set the type of incubator
  int sub_type_id = 2;
  int hot = 102;                //set hot parameter
  float optimum_temp = 99.5;    // set optimum_temp temp to go to b4 turning off
  float cold = 89.9;            //set cold parameter
  int high_hum = 65;            //set high humidity parameter
  int optimum_hum = 60;         // set optimum humidity parameter to go to b4 turning off
  int low_hum = 55;             // set low humidity parameter
};

struct peacock_config
{
  char *node_type = "incubator";
  char *sub_type = "peacock";       // set the type of incubator
  int sub_type_id = 3;
  int hot = 101;                //set hot parameter
  float optimum_temp = 99.5;    // set optimum_temp temp to go to b4 turning off
  float cold = 98.9;            //set cold parameter
  int high_hum = 65;            //set high humidity parameter
  int optimum_hum = 60;         // set optimum humidity parameter to go to b4 turning off
  int low_hum = 55;             // set low humidity parameter
};

struct chameleon_config
{
  char *node_type = "incubator";
  char *sub_type = "chameleon";     // set the type of incubator
  int sub_type_id = 4;
  int hot = 81;                 //set hot parameter
  float optimum_temp = 77.5;    // set optimum_temp temp to go to b4 turning off
  float cold = 76.5;            //set cold parameter
  int high_hum = 95;            //set high humidity parameter
  int optimum_hum = 85;         // set optimum humidity parameter to go to b4 turning off
  int low_hum = 75;             // set low humidity parameter
};


// structure for current incubator configuration
struct current_config
{
  char *node_type = "incubator";
  char *sub_type;               // set the type of incubator
  int sub_type_id;
  int hot;                  //set hot parameter
  float optimum_temp;       // set optimum_temp temp to go to b4 turning off
  float cold;               //set cold parameter
  int high_hum;             //set high humidity parameter
  int optimum_hum;          // set optimum humidity parameter to go to b4 turning off
  int low_hum;              // set low humidity parameter
} currentConfig;
 

//////////////////////////////////////////////////////

Вот в чем у меня проблемы.

     // setup directed sub-type
void switch_sub_type(int sub_type)
{
  switch (sub_type)
  {
    // assign the bird type params
    case 1: chicken_config currentConfig;
    case 2: turkey_config currentConfig;
    case 3: peacock_config currentConfig;
    case 4: chameleon_config currentConfig;
  }
  return;
}
 

ЛЮБЫЕ предложения или советы будут высоко оценены.

Комментарии:

1. Это объявление char node_type = «инкубатор»; не имеет смысла. Вы пытаетесь инициализировать один символ строковым литералом.

2. Вы определили пять различных несвязанных и несовместимых struct типов. Я сильно подозреваю, что вам нужно что-то совсем, совсем другое. Как насчет одного struct типа и пяти разных значений?

3. как они не связаны между собой? Они имеют элементы одного и того же типа и одинаковой длины.

4. Они не связаны, потому что у них разные имена.

5. Кстати, подумайте об использовании соглашения об именовании, в котором имена структур имеют другой стиль, чем переменные (и члены). Это значительно упростит дифференциацию структур от переменных.

Ответ №1:

В вашем коде есть несколько соответствующих проблем

  1. Концепция C struct кажется неправильной: вы можете определить один struct тип с определенным набором параметров и создать несколько его экземпляров struct . В вашем случае вы можете создать базовую структуру animal_config и по одному экземпляру для каждого животного, которое вы хотите включить в свой код.

Таким образом, вы можете создать общую конфигурацию:

     struct animal_config
    {
      char node_type;
      char sub_type;        // set the type of incubator
      int sub_type_id;
      int hot = 102;                //set hot parameter
      float optimum_temp;    // set optimum_temp temp to go to b4 turning off
      float cold;            //set cold parameter
      int high_hum;            //set high humidity parameter
      int optimum_hum;         // set optimum humidity parameter to go to b4 turning off
      int low_hum;             // set low humidity parameter
    };
 

А затем назначьте ему разные значения в зависимости от условия:

 

    void switch_sub_type(int sub_type)
    {
      switch (sub_type)
      {
        // assign the bird type params
        struct animal_config currentConfig;
        case 1: 
          animal_config.node_type = "incubator";
          animal_config.sub_type = "chicken";
          animal_config.sub_type_id = 1;
          animal_config.hot = 102;
             ...
          };
          break;
        case 2:
        ...
      }
      return;
    }
 
  1. Я не знаю, является ли это просто минимальным примером, но switch_sub_type метод ничего не возвращает и нигде не сохраняет текущую конфигурацию. Он будет удален из стека после завершения вызова функции. Следуя моему предыдущему примеру, возможно, вы захотите вернуть currentConfig объект вызывающему:
 

    struct animal_config switch_sub_type(int sub_type)
    {
      switch (sub_type)
      {
        // assign the bird type params
        struct animal_config currentConfig;
        case 1: 
          animal_config.node_type = "incubator";
          animal_config.sub_type = "chicken";
          animal_config.sub_type_id = 1;
          animal_config.hot = 102;
             ...
          };
          break;
        case 2:
        ...
      }
      return currentConfig;
    }
 
  1. Что касается вашего предложения о переключении, возможно, вам нужно включить break; заявление после каждого случая. В противном случае, если выбрано обращение, все обращения после него также будут выполнены, что приведет (вероятно) к нежелательному поведению.

Комментарии:

1. animal_config = { неверно, вы не можете назначить тип . Другим вариантом было бы иметь const предопределенные объекты для возможных инициализаторов, а затем оператор switch просто выполняет простое назначение

2. Да, вы правы. Это возможно только для инициализации. Я все исправлю. Спасибо.

Ответ №2:

У меня есть две рекомендации: одна структура, отдельные переменные; и один базовый класс, несколько дочерних классов.

Одна структура, Много переменных

Согласно вашему коду, каждая птица может быть другим экземпляром одной и той же структуры.

 struct Bird_Config
{
  char *node_type;
  char *sub_type;       // set the type of incubator
  int sub_type_id;
  int hot;                //set hot parameter
  float optimum_temp;    // set optimum_temp temp to go to b4 turning off
  float cold;            //set cold parameter
  int high_hum;            //set high humidity parameter
  int optimum_hum;         // set optimum humidity parameter to go to b4 turning off
  int low_hum;             // set low humidity parameter
};

int main()
{
   Bird_Config chicken;
   chicken.hot = 102;

   Bird_Config turkey;
   //...
   return 0;
}
 

Базовый класс и наследование

Другой реализацией может быть использование родительского/базового класса и множества дочерних классов:

 struct Bird_Config
{
      char *node_type = "incubator";
      char *sub_type;       // set the type of incubator
      int sub_type_id;
      int hot;                //set hot parameter
      float optimum_temp;    // set optimum_temp temp to go to b4 turning off
      float cold;            //set cold parameter
      int high_hum;            //set high humidity parameter
      int optimum_hum;         // set optimum humidity parameter to go to b4 turning off
      int low_hum;             // set low humidity parameter
};  

class Chicken_Config : public Bird_Config
{
     Bird_Config::sub_type = "chicken";
     //...
};

The inheritance model allows you to do something like this:  
int main()
{
   std::vector<Bird_Config *> configs;
   Bird_Config * p_bird = new Chicken_Config;
   configs.push_back(p_bird);
   p_bird = new Turkey_Config;
   configs.push_back(p_bird);
   //...
   for (int i = 0; i < configs.size();   i)
   {
      std::cout << "Bird Configuration["
                << i
                << "]: "
                << configs[i]->sub_type
                << "n";
   }
   return 0;
}
 

В приведенном выше примере вам не нужно делать это в switch зависимости от типа конфигурации. Механизм наследования (полиморфизм) справится с этим за вас.

Комментарии:

1. Не согласен с предложением о наследовании — оно чрезмерно усложняет код, и вектор необработанных указателей трудно правильно использовать (опять же, чрезмерно усложняя код, чтобы избежать утечек памяти) . Было бы намного проще просто иметь vector<Bird_Config> и инициализировать значения в обычном режиме