是否可以浏览结构?

时间:2014-06-23 07:44:24

标签: c++ structure

我需要每10 mS填充一个结构,在这个结构中有230个变量,只有boolint。我的想法是首先逐个填充并初始化所有变量。但是编写它并且看起来非常难看。这种结构也常常发生变化。

所以我的第二个想法是浏览结构(可能使用循环?)并随机填充每个变量。

经过一番研究,我找不到任何东西。那么,有没有办法浏览我的结构并随机填充变量?

感谢您的帮助。

编辑:这是我尝试做的事情:

我有一个包含结构的头文件:

    typedef struct
        {
            /// Statut Ground-Flight
            int _statutGroundFlight;
            /// Statut Capteur de presence
            bool _statutCapteurPrensence;
            /// Statut Bouton OPEN in
            bool _statutBoutonOpenIn;
            /// Statut Bouton OPEN ext
            bool _statutBoutonOpenExt;
            /// Statut Bouton CLOSE in
            bool _statutBoutonCloseIn;
            /// Statut Bouton CLOSE ext
            bool _statutBoutonCloseExt;
...

这就是我每10 mS想要做的事情:

//Create a structure
struct myStruct;

//Browse the structure
for(int i; myStruct.size(); ++i){
   if(myStruct[i] is int){
      //Fill it randomly with int
   }
   if(mystruct[i] is bool){
      //Fill it randomly with bool
   }
}

4 个答案:

答案 0 :(得分:1)

我会选择使用std::map来存储您的会员的价值。

class MyStructure
{
    std::map< unsigned int, int > integerValues;
    std::map< unsigned int, bool > booleanValues;
public:
    bool & exampleBoolean = booleanValues[ 0 ];
    int & exampleInteger = integerValues[ 0 ];
    void randomIntegers() { 
        for( auto & integer : integerValues )
            integer.second = randomInteger(); // put your favorite random here
    }
};

这样您只会更改实际存储的地点数据,而不会更改您访问结构的方式。

我建议使用字段名称enum来索引地图。

答案 1 :(得分:1)

一种简单的方法是对相同类型的字段进行分组,然后使用特定于类型的数组创建一个联合。

ideone.com

的示例
#include <iostream>
using namespace std;

union X
{
    struct
    {
        int i1, i2, i3;
        bool b1, b2, b3;
    };

    struct
    {
        int is[3];
        bool bs[3];
    };
};

std::ostream& operator<<(std::ostream& os, const X& x)
{
    os << "{ ";
    for (int i = 0; i < 3; ++i)
        os << x.is[i] << ' ' << x.bs[i] << ' ';
    return os << '}';
}

int main()
 {
    for (int i = 0; i < 3; ++i)
    {
        X x;
        for (int j = 0; j < 3; ++j)
        {
            x.is[j] = rand();
            x.bs[j] = rand() % 2;
        }
        std::cout << x << '\n';
    }
}

(当然,除了对数组维度编制索引进行硬编码之外,你应该做一些更好的事情,并允许intbool的数量独立变化,但是& #39; s琐碎......)

示例输出:

{ 1804289383 0 1681692777 1 1957747793 1 }
{ 719885386 0 596516649 1 1025202362 1 }
{ 783368690 1 2044897763 0 1365180540 0 }

答案 2 :(得分:1)

我认为没有办法浏览结构并根据需要填充变量,但您可以避免使用宏编写代码。 您可以编写宏并让预处理器为您生成代码。 例如:

创建一个struct.def,您可以在其中定义必填字段

#ifndef INTEGER
#error "INTEGER not defined"
#endif
#ifndef BOOL
#error "BOOL not defined"
#endif  
#ifndef create_struct 
#error "create_struct not defined"
#endif  


create_struct(my_struct,
        INTEGER(i1)
        BOOL(b1,false)
        INTEGER(i2)
        INTEGER(i3)
        BOOL(b2,true)
        BOOL(b3,false)
        BOOL(b4,false)
        INTEGER(i4)
        //add or modify fields here
)       

#undef INTEGER
#undef BOOL
#undef create_struct

然后使用上面的文件

在代码中编写宏
#include "stdio.h"
#include "string.h"
//create structure
#define INTEGER(var_name) int var_name;
#define BOOL(var_name,data) bool var_name;
#define create_struct(struct_id,data_type)\
        typedef struct struct_id##_tag{\
                data_type\
        }struct_id;
#include "struct.def"
//-------------------------------------------

//function to initialize default value
#define INTEGER(var_name) p->var_name=0;
#define BOOL(var_name,data) p->var_name=data;
#define create_struct(struct_id,data_type)\
        void initialize_##struct_id(struct_id* p)\
        {\
                data_type\
        }
#include "struct.def"
//-------------------------------------------------

//function to fill random value to structure        
#define INTEGER(var_name) p->var_name=rand();
#define BOOL(var_name,data) p->var_name=rand()%2;
#define create_struct(struct_id,data_type)\
        void fill_random_##struct_id(struct_id* p)\
        {\
                data_type\
        }
#include "struct.def"
//-----------------------------------------

现在,如果您运行预处理器,那么它将为您生成下面提到的代码....

typedef struct my_struct_tag{
        int i1;
        bool b1; 
        int i2; 
        int i3;
        bool b2; 
        bool b3; 
        bool b4; 
        int i4; 
}my_struct;
void initialize_my_struct(my_struct* p) { 
        p->i1=0; 
        p->b1=false; 
        p->i2=0;
        p->i3=0; 
        p->b2=true;
        p->b3=false; 
        p->b4=false;
        p->i4=0; 
}
void fill_random_my_struct(my_struct* p) {
        p->i1=rand(); 
        p->b1=rand()%2;
        p->i2=rand(); 
        p->i3=rand(); 
        p->b2=rand()%2;
        p->b3=rand()%2;
        p->b4=rand()%2; 
        p->i4=rand();
}

现在,如果您想更改结构,则只需更改struct.def文件中的一个位置

您可以查看链接http://rajenpandit.blogspot.in/p/using-macro.html以获取更多详细信息。

答案 3 :(得分:0)

您不能按照自己的意愿迭代结构的字段。

如果这是一个测试,那么你不应该调整结构以适应测试。相反,只需要做到这一点&#34; hard&#34;方式 - 填补每个领域。这也很重要,因为不同的领域肯定有不同的方式随机&#34;。例如_statutGroundFlight可能不是任何整数值;它可能有一组有效的值来测试。