Creating & initialising a const struct

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

Creating & initialising a const struct

跳至解决方案
1,983 次查看
FridgeFreezer
Senior Contributor I

I'm trying to do something which I'm sure is easily done but I can't find the right way of doing it.

 

I have a structure type in my code something like this:

 

struct mystruct{    uint8  valid;    uint8  foo;    uint8  bar;    uint16 cats;    uint32 dogs;    uint8 checksum;}

 

 

which is then part of a larger structure:

 

struct everything{  struct otherstruct something;  struct mystruct some_things[NUMBER_OF_THINGS];  ...etc.}

This resides in RAM and the contents are modified by the software.

 

I would like to be able to "reset" the entire struct to defaults by creating a const like:

 

const struct mystruct default ={     valid = TRUE;     foo = 0x64;     bar = 10;     cats = 300;     dogs = 9999999;     checksum = 0xFF;}

 

 

and then doing a simple one-line copy:

everything->some_things[2] = default;

Rather than having to set each individual value.

 

I know I can do this:

const struct mystruct default = {TRUE, 0x64, 10, 300, 9999999, 0xFF}

But it's not as readable and requires things to be in the correct order.

 

I'm sure I'm missing the obvious here, can anyone help?

标签 (1)
标记 (1)
0 项奖励
回复
1 解答
1,633 次查看
FridgeFreezer
Senior Contributor I

I think I've found the answer, via Stackoverflow (http://stackoverflow.com/questions/330793/how-to-initialize-a-struct-in-ansi-c):

 

typedef struct Foos{
    int a;
    int b;
}Foos;

And the following definition of a const struct of type Foos

static const Foos foo ={
    .a =1,
    .b =2,
};

在原帖中查看解决方案

0 项奖励
回复
3 回复数
1,633 次查看
ipa
Contributor III

Hi,

I have done this in several projects:

typedef union{ // for DS1390 chip !!!
uint8_t tm[8];
struct{
uint8_t frsec; // fractions of seconds, BCD 0;
uint8_t seconds; // 00-59,BCD 1;
uint8_t mins; // 00-59,BCD 2;
uint8_t hrs; // 00-23,BCD; bit6 must be 0 3;
uint8_t wday; // week day, not used 4;
uint8_t mday; // month day, 00-31,BCD 5;
uint8_t month; // 0x80 | month; bit7 = century 6;
uint8_t year; // year, 00-99, BCD; offset+2000 7;
}dt;
}dtime;

The advantage is tm[], which can be filled up as simple memory locations, using memcpy(). The only problem can appear if you are interested by portability.

Of coarse this is not the only solution for you.

Regards,

Ipa 

0 项奖励
回复
1,633 次查看
FridgeFreezer
Senior Contributor I

ipa - I don't see how that is any different to having to write:

const defaults = { 1, TRUE, 'a', 0,0,0,57,0x8000,0,0,0} etc.

 

When I want to be able to write something like this:

 

const defaults = {
frsec = 0;
year = 2000;

seconds = 0;
mins = 2;
hrs = 3;
};

With named variables being initialised, without having to type all of them in the exact order, and any which aren't named being left as zero.

 

I already know I can reset the "live" version to this stored (in flash) default by doing this:

settings = defaults;

Which copies the structure data across like any other variable.

0 项奖励
回复
1,634 次查看
FridgeFreezer
Senior Contributor I

I think I've found the answer, via Stackoverflow (http://stackoverflow.com/questions/330793/how-to-initialize-a-struct-in-ansi-c):

 

typedef struct Foos{
    int a;
    int b;
}Foos;

And the following definition of a const struct of type Foos

static const Foos foo ={
    .a =1,
    .b =2,
};
0 项奖励
回复