关于结构体初始化的相关总结

本文详细介绍了汉字字模数据结构的定义及其在不同场景下的应用实例,包括点阵码数据排列方式和具体编码实现。

1. 这样定义并初始化是可以的

// ------------------  汉字字模的数据结构定义 ------------------------ //
typedef struct typFNT_GB16                 // 汉字字模数据结构
{
       signed char Index[2];               // 汉字内码索引
       char Msk[32];                       // 点阵码数据
};

struct typFNT_GB16 code GB_16[] =          // 数据表
{
"欢", 0x04,0x34,0xC4,0x04,0xC4,0x3C,0x20,0x10,
      0x0F,0xE8,0x08,0x08,0x28,0x18,0x00,0x00,
      0x10,0x08,0x06,0x01,0x82,0x8C,0x40,0x30,
      0x0C,0x03,0x0C,0x10,0x60,0xC0,0x40,0x00,

"迎", 0x40,0x42,0x44,0xC8,0x00,0xFC,0x04,0x02,
      0x82,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
      0x00,0x40,0x20,0x1F,0x20,0x47,0x42,0x41,
      0x40,0x7F,0x40,0x42,0x44,0x63,0x20,0x00,

"使", 0x40,0x20,0xF8,0x07,0x04,0xF4,0x14,0x14,
      0x14,0xFF,0x14,0x14,0x14,0xF6,0x04,0x00,
      0x00,0x00,0xFF,0x00,0x80,0x43,0x45,0x29,
      0x19,0x17,0x21,0x21,0x41,0xC3,0x40,0x00,

"用", 0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,
      0x22,0x22,0x22,0x22,0xFF,0x02,0x00,0x00,
      0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x7F,
      0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,

"!", 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xFE,
      0xFE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x3B,
      0x3B,0x10,0x00,0x00,0x00,0x00,0x00,0x00
};

2. 但这样是不行的


// ------------------  汉字字模的数据结构定义 ------------------------ //
typedef struct typFNT_GB16                 // 汉字字模数据结构
{
       int  Index;               // 汉字内码索引
       char Msk[32];                       // 点阵码数据
};

/////////////////////////////////////////////////////////////////////////
// 汉字字模表                                                          //
// 汉字库: 宋体16.dot 纵向取模下高位,数据排列:从左到右从上到下         //
/////////////////////////////////////////////////////////////////////////
struct typFNT_GB16 code GB_16[] =          // 数据表
{
0x2D3F,
      0x04,0x34,0xC4,0x04,0xC4,0x3C,0x20,0x10,
      0x0F,0xE8,0x08,0x08,0x28,0x18,0x00,0x00,
      0x10,0x08,0x06,0x01,0x82,0x8C,0x40,0x30,
      0x0C,0x03,0x0C,0x10,0x60,0xC0,0x40,0x00,

0x5CD4,
      0x40,0x42,0x44,0xC8,0x00,0xFC,0x04,0x02,
      0x82,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
      0x00,0x40,0x20,0x1F,0x20,0x47,0x42,0x41,
      0x40,0x7F,0x40,0x42,0x44,0x63,0x20,0x00,

0x64ED, 
      0x40,0x20,0xF8,0x07,0x04,0xF4,0x14,0x14,
      0x14,0xFF,0x14,0x14,0x14,0xF6,0x04,0x00,
      0x00,0x00,0xFF,0x00,0x80,0x43,0x45,0x29,
      0x19,0x17,0x21,0x21,0x41,0xC3,0x40,0x00,

0x2368,
      0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,
      0x22,0x22,0x22,0x22,0xFF,0x02,0x00,0x00,
      0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x7F,
      0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,

0x8F9C,
      0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xFE,
      0xFE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x3B,
      0x3B,0x10,0x00,0x00,0x00,0x00,0x00,0x00
};

3. 这样是可以的

// ------------------  汉字字模的数据结构定义 ------------------------ //
typedef struct typFNT_GB16                 // 汉字字模数据结构
{
       int  Index;               // 汉字内码索引
       char Msk[32];                       // 点阵码数据
};

/////////////////////////////////////////////////////////////////////////
// 汉字字模表                                                          //
// 汉字库: 宋体16.dot 纵向取模下高位,数据排列:从左到右从上到下         //
/////////////////////////////////////////////////////////////////////////
struct typFNT_GB16 code GB_16[] =          // 数据表
{
{0x2D3F,
      0x04,0x34,0xC4,0x04,0xC4,0x3C,0x20,0x10,
      0x0F,0xE8,0x08,0x08,0x28,0x18,0x00,0x00,
      0x10,0x08,0x06,0x01,0x82,0x8C,0x40,0x30,
      0x0C,0x03,0x0C,0x10,0x60,0xC0,0x40,0x00,},

{0x5CD4,
      0x40,0x42,0x44,0xC8,0x00,0xFC,0x04,0x02,
      0x82,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
      0x00,0x40,0x20,0x1F,0x20,0x47,0x42,0x41,
      0x40,0x7F,0x40,0x42,0x44,0x63,0x20,0x00,},

{0x64ED, 
      0x40,0x20,0xF8,0x07,0x04,0xF4,0x14,0x14,
      0x14,0xFF,0x14,0x14,0x14,0xF6,0x04,0x00,
      0x00,0x00,0xFF,0x00,0x80,0x43,0x45,0x29,
      0x19,0x17,0x21,0x21,0x41,0xC3,0x40,0x00,},

{0x2368,
      0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,
      0x22,0x22,0x22,0x22,0xFF,0x02,0x00,0x00,
      0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x7F,
      0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00},

{0x8F9C,
      0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xFE,
      0xFE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x3B,
      0x3B,0x10,0x00,0x00,0x00,0x00,0x00,0x00}
};

4. 也可以这样定义使用,并且是最方便的

// ------------------  汉字字模的数据结构定义 ------------------------ //
typedef struct typFNT_GB16                 // 汉字字模数据结构
{
       int  Index;               // 汉字内码索引
       char Msk[32];                       // 点阵码数据
};

/////////////////////////////////////////////////////////////////////////
// 汉字字模表                                                          //
// 汉字库: 宋体16.dot 纵向取模下高位,数据排列:从左到右从上到下         //
/////////////////////////////////////////////////////////////////////////
unsigned char GB_16[] =          // 数据表
{
{0x2D, 0x3F,
      0x04,0x34,0xC4,0x04,0xC4,0x3C,0x20,0x10,
      0x0F,0xE8,0x08,0x08,0x28,0x18,0x00,0x00,
      0x10,0x08,0x06,0x01,0x82,0x8C,0x40,0x30,
      0x0C,0x03,0x0C,0x10,0x60,0xC0,0x40,0x00,},

{0x5C, 0xD4,
      0x40,0x42,0x44,0xC8,0x00,0xFC,0x04,0x02,
      0x82,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
      0x00,0x40,0x20,0x1F,0x20,0x47,0x42,0x41,
      0x40,0x7F,0x40,0x42,0x44,0x63,0x20,0x00,},

{0x64, 0xED, 
      0x40,0x20,0xF8,0x07,0x04,0xF4,0x14,0x14,
      0x14,0xFF,0x14,0x14,0x14,0xF6,0x04,0x00,
      0x00,0x00,0xFF,0x00,0x80,0x43,0x45,0x29,
      0x19,0x17,0x21,0x21,0x41,0xC3,0x40,0x00,},

{0x23, 0x68,
      0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,
      0x22,0x22,0x22,0x22,0xFF,0x02,0x00,0x00,
      0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x7F,
      0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00},

{0x8F, 0x9C,
      0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xFE,
      0xFE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x3B,
      0x3B,0x10,0x00,0x00,0x00,0x00,0x00,0x00}
};

struct typFNT_GB16 *ptypFNT_GB16;
*ptypFNT_GB16=GB_16;


以结构体指针的形式访问












在C++中,初始化结构体的方法有多种,具体决于需求和上下文环境。以下是几种常见的初始化方式及其语法说明: ### 1. 使用构造函数初始化结构体 C++允许在定义结构体时直接为其添加构造函数,从而在创建结构体实例时自动完成初始化。这种方式提供了类型安全和更清晰的代码,是C++中推荐的初始化方法之一。例如: ```cpp struct MyStruct { int id; std::string name; // 构造函数 MyStruct(int i, const std::string& n) : id(i), name(n) {} }; int main() { MyStruct s(1, "John"); // 使用构造函数初始化 return 0; } ``` ### 2. 使用值初始化(Value Initialization) 对于结构体数组或单个结构体变量,可以使用值初始化的方式直接在定义时赋予初始值。这种方法适用于结构体成员变量较少的情况,例如: ```cpp struct MyStruct { int id; std::string name; }; int main() { MyStruct s = {1, "John"}; // 使用值初始化 return 0; } ``` 如果结构体数组需要初始化,可以按照如下方式操作: ```cpp MyStruct myArray[] = { {1, "John"}, {2, "Alice"}, {3, "Bob"} }; ``` ### 3. 使用`memset`进行零初始化 尽管`memset`主要用于C语言中的结构体初始化,但在C++中也可以使用它来将结构体的所有成员变量初始化为零或空值。这种方法适用于需要将整个结构体清零的情况,例如: ```cpp struct MyStruct { int id; std::string name; }; int main() { MyStruct s; memset(&s, 0, sizeof(MyStruct)); // 使用memset进行零初始化 return 0; } ``` ### 4. 使用默认成员初始化(C++11及以上) 从C++11开始,可以直接在结构体定义中为成员变量提供默认值。这种方式适用于希望在定义结构体时为成员变量赋予固定初始值的情况,例如: ```cpp struct MyStruct { int id = 0; std::string name = "Default"; }; int main() { MyStruct s; // 成员变量id和name会被自动初始化为0和"Default" return 0; } ``` ### 5. 使用初始化列表(Initializer List)进行初始化 在C++11及以上版本中,可以通过初始化列表来初始化结构体的成员变量。这种方式与值初始化类似,但更灵活,例如: ```cpp struct MyStruct { int id; std::string name; MyStruct(std::initializer_list<int> ids, const std::string& n) { // 自定义初始化逻辑 id = *ids.begin(); // 第一个元素作为id name = n; } }; int main() { MyStruct s({1, 2, 3}, "John"); // 使用初始化列表初始化 return 0; } ``` ### 总结 C++中初始化结构体的方法多样,选择合适的方法可以提高代码的可读性和可维护性。对于现代C++(C++11及以上),推荐使用默认成员初始化或构造函数初始化,以确保类型安全和代码清晰性[^2]。而对于需要清零的场景,`memset`仍然是一个有效的工具[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值