访问结构体成员->与.的区别

定义结构体指针,访问成员时就用->
定义结构体变量,访问成员时就用.

例如:

struct A {
int a;
char b;
};

struct A q; 访问成员就用:q.a;
struct A *p; 访问成员就用:p->a;
eg:
首先定义结构体指针:
CTRL_CHANNELHW_TABLE

typedef struct
{
        IO_CONFIG   relay;          // 继电器
        LED_HANDLE  relay_handle;   // 继电器句柄
        IO_CONFIG   button;         // 控制按键
        IO_CONFIG   led;            // 状态指示灯
        LED_HANDLE  led_handle;     // 状态指示灯句柄
        int         dpid;           // 该通道绑定的dpid
        int         cd_dpid;        // 该通道绑定的倒计时dpid 小于0表示不存在
        int         cd_sec;         // 通道倒计时 -1 停止
        BOOL        stat;           // 通道状态 TRUE - 有效; FALSE - 无效
}CTRL_CHANNEL;
// HW_TABLE结构体类型
// 抽象描述硬件配置
typedef struct
{
    IO_CONFIG   wifi_stat_led;      // wifi状态指示灯
        LED_HANDLE  wifi_stat_led_handle;

    // 电源总开关 存在通道有效时按下关闭 否则按下全部开启
    IO_CONFIG power_button;
    int         channel_num;
    CTRL_CHANNEL *channels;         // 通道列表 *!* 不要重新指向其他位置
}HW_TABLE;

接着定义结构体变量
channels[] g_hw_table

static CTRL_CHANNEL channels[] = 
{
    // channel 0
    {
        // 继电器
        .relay  = {.type = IO_DRIVE_LEVEL_HIGH, .pin = GPIO_ID_PIN(13)},
        // 按钮
        .button = {.type = IO_DRIVE_LEVEL_LOW, .pin = GPIO_ID_PIN(16)},
        // 通道状态指示灯
        .led    = {.type = IO_DRIVE_LEVEL_NOT_EXIST},
        // 绑定dpid
        .dpid   = 1,
        // 绑定倒计时dpid DPID_NOT_EXIST表示不存在倒计时
        .cd_dpid = 101
    },
    // channel 1
    {
        // 继电器
        .relay  = {.type = IO_DRIVE_LEVEL_HIGH, .pin = GPIO_ID_PIN(5)},
        // 按钮
        .button = {.type = IO_DRIVE_LEVEL_LOW, .pin = GPIO_ID_PIN(14)},
        // 通道状态指示灯
        .led    = {.type = IO_DRIVE_LEVEL_NOT_EXIST},
        // 绑定dpid
        .dpid   = 2,
        // 绑定倒计时dpid DPID_NOT_EXIST表示不存在倒计时
        .cd_dpid = 103
    },
    // channel 2
    {
        // 继电器
        .relay  = {.type = IO_DRIVE_LEVEL_HIGH, .pin = GPIO_ID_PIN(15)},
        // 按钮
        .button = {.type = IO_DRIVE_LEVEL_LOW, .pin = GPIO_ID_PIN(12)},
        // 通道状态指示灯
        .led    = {.type = IO_DRIVE_LEVEL_NOT_EXIST},
        // 绑定dpid
        .dpid   = 3,
        // 绑定倒计时dpid DPID_NOT_EXIST表示不存在倒计时
        .cd_dpid = 104
    },
    // channel 2
    {
        // 继电器
        .relay  = {.type = IO_DRIVE_LEVEL_HIGH, .pin = GPIO_ID_PIN(4)},
        // 按钮
        .button = {.type = IO_DRIVE_LEVEL_NOT_EXIST},
        // 通道状态指示灯
        .led    = {.type = IO_DRIVE_LEVEL_NOT_EXIST},
        // 绑定dpid
        .dpid   = 4,
        // 绑定倒计时dpid DPID_NOT_EXIST表示不存在倒计时
        .cd_dpid = 102
    }
};

// 硬件配置表全局变量
HW_TABLE g_hw_table = 
{
    // wifi状态指示灯 有效对应wifi连接 无效对应wifi未连接 配置完后显示电源状态
    .wifi_stat_led =   {.type = IO_DRIVE_LEVEL_LOW, .pin = GPIO_ID_PIN(0)},

    // 电源总开关 存在通道有效时按下关闭 否则按下全部开启
    .power_button =    {.type = IO_DRIVE_LEVEL_NOT_EXIST},
    .channels = channels
};

使用示例
访问结构体指针的成员用->

set_led_light_type(hw_table->channels[channel_no].relay_handle, OL_HIGH, 0);

访问结构体变量的成员用”.”

 if(g_hw_table.channels[i].button.pin == gpio_no)
        {
            // 事件类型
            if(LONG_KEY == type)
            {
                // 长按 更改wifi配网状态
                single_dev_reset_factory();    
            }
            else if(NORMAL_KEY == type)
            {
                if(Boot_key== BOOT_KEY_OK){
                    Boot_key=BOOT_KEY_NO;  
                }
                else{
                    // 普通按键 触发该通道状态切换
                   // hw_trig_channel(&g_hw_table, i);
                    //hw_set_channel(&g_hw_table, i, true);
                    //hw_set_channel(&g_hw_table, i, false);
                    // 切换后上报当前状态
                    char buff[30];
                    if(g_hw_table.channels[i].stat)
                    {
                        sprintf(buff, "{\"%d\":true}", g_hw_table.channels[i].dpid);
                    }
                    else
                    {
                        sprintf(buff, "{\"%d\":false}", g_hw_table.channels[i].dpid);
                    }

                    // 推送数据到云
                    dp_upload_proc(buff);
                    //倒计时
                    // 倒计时
                    if(is_count_down)
                    {
                        g_hw_table.channels[i].cd_sec = -1;
                        sprintf(buff, "{\"%d\":0}", g_hw_table.channels[i].cd_dpid);// 回复倒计时0
                        // 推送倒计时数据
                        dp_trans_upload_proc(buff);
                    }
                    // 启动断电记忆存储定时器
                    if(is_save_stat)
                    {
                        sys_start_timer(save_stat_timer, 5000, TIMER_ONCE);
                    }
                }
            }
        }

你可能感兴趣的:(物联网,嵌入式开发)