[C语言] 结构体的声明和赋值问题

[复制链接]
2416|16
 楼主| hanfei08131106 发表于 2017-5-3 16:24 | 显示全部楼层 |阅读模式
--------------------------------第一个结构体定义----------------------------------------------------------
/*******************************************
* 消息处理回调函数数据结构
*******************************************/
typedef struct MessageData
{
    MQTTMessage* message;   //mqtt消息结构体
    MQTTString* topicName;  //订阅的主题topic
}MessageData;
--------------------------------第二个结构体定义----------------------------------------------------------
/*******************************************
* 订阅主题对应的消息处理结构
*******************************************/
typedef struct MessageHandlers
{
    const char* topicFilter;      //pub消息对应的主题
    void (*fp) (MessageData*);    //pub消息处理函数
}MessageHandlers;
--------------------------------在函数内定义使用时----------------------------------------------------------
MessageHandlers handler = {topicFilter,NULL};
此时编译是错误的,用的是MDK5.
有没有别的写法可以完美的定义并且赋值。
错误提示为附件图片。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
yearnext 发表于 2017-5-3 17:07 | 显示全部楼层
楼主能够放出相关代码吗?
报错的原因可能和topicFilter有关。
 楼主| hanfei08131106 发表于 2017-5-3 17:10 | 显示全部楼层
yearnext 发表于 2017-5-3 17:07
楼主能够放出相关代码吗?
报错的原因可能和topicFilter有关。

int MQTTUnsubscribe(Client *c,const char* topicFilter, unsigned int msgId)
{
                int len = 0;
    int rc = 0;
    Timer timer;
                MessageHandlers handler = {topicFilter,NULL};
                list_node_t *node = NULL;
    MQTTString topic = MQTTString_initializer;
    topic.cstring = (char *)topicFilter;

    InitTimer(&timer);
    countdown_ms(&timer, c->command_timeout_ms);

    aliyun_iot_mutex_lock(&c->writebufLock);

    if ((len = MQTTSerialize_unsubscribe(c->buf, c->buf_size, 0, (unsigned short)msgId, 1, &topic)) <= 0)
    {
        aliyun_iot_mutex_unlock(&c->writebufLock);
        return MQTT_UNSUBSCRIBE_PACKET_ERROR;
    }

    //将sub信息保存到subInfoList中
    if (SUCCESS_RETURN != push_subInfo_to(c,len,msgId,UNSUBSCRIBE,&handler,&node))
    {
        WRITE_IOT_ERROR_LOG("push publish into to pubInfolist failed!");
        aliyun_iot_mutex_unlock(&c->writebufLock);
        return MQTT_PUSH_TO_LIST_ERROR;
    }

    if ((rc = sendPacket(c, c->buf,len, &timer)) != SUCCESS_RETURN) // send the subscribe packet
    {
        //发送失败则删除之前放入subInfoList链表中的节点
        aliyun_iot_mutex_lock(&c->subInfoLock);
        list_remove(c->subInfoList, node);
        aliyun_iot_mutex_unlock(&c->subInfoLock);
        aliyun_iot_mutex_unlock(&c->writebufLock);
        return MQTT_NETWORK_ERROR;
    }

    aliyun_iot_mutex_unlock(&c->writebufLock);

    return SUCCESS_RETURN;
}
 楼主| hanfei08131106 发表于 2017-5-3 17:13 | 显示全部楼层
yearnext 发表于 2017-5-3 17:07
楼主能够放出相关代码吗?
报错的原因可能和topicFilter有关。

topicFilter是个变量,问题可能出现在这个上面。我改动如下:
                MessageHandlers handler;
                handler.topicFilter = topicFilter;
                handler.fp = NULL;
不知道是不是可以?
yearnext 发表于 2017-5-3 17:17 | 显示全部楼层
hanfei08131106 发表于 2017-5-3 17:10
int MQTTUnsubscribe(Client *c,const char* topicFilter, unsigned int msgId)
{
                int len = 0;

楼主方便发一下工程吗?
从语法角度来说楼主这么写没什么问题
yearnext 发表于 2017-5-3 17:19 | 显示全部楼层
hanfei08131106 发表于 2017-5-3 17:13
topicFilter是个变量,问题可能出现在这个上面。我改动如下:
                MessageHandlers handler;
                handler.top ...

要注意handler.topicFilter是由const修饰的
 楼主| hanfei08131106 发表于 2017-5-3 17:27 | 显示全部楼层
yearnext 发表于 2017-5-3 17:17
楼主方便发一下工程吗?
从语法角度来说楼主这么写没什么问题

我移植的阿里云的SDK到UCOS平台,还有最后一个问题,解决后公布。你在做相关的项目吗?
yearnext 发表于 2017-5-3 17:31 | 显示全部楼层
hanfei08131106 发表于 2017-5-3 17:27
我移植的阿里云的SDK到UCOS平台,还有最后一个问题,解决后公布。你在做相关的项目吗? ...

没有,我只是好奇代码报错的原因
yearnext 发表于 2017-5-3 17:33 | 显示全部楼层
yearnext 发表于 2017-5-3 17:31
没有,我只是好奇代码报错的原因
typedef struct MessageHandlers
{
    const char* topicFilter;      //pub消息对应的主题
    void (*fp) (void*);    //pub消息处理函数
}MessageHandlers;

void MQTTUnsubscribe(const char* topicFilter)
{
    MessageHandlers handler = {topicFilter, NULL};
}


我修改成这样编译没有报错

yearnext 发表于 2017-5-3 17:34 | 显示全部楼层
yearnext 发表于 2017-5-3 17:33
我修改成这样编译没有报错

猜测可能是由别的原因导致的报错
yearnext 发表于 2017-5-3 17:35 | 显示全部楼层
hanfei08131106 发表于 2017-5-3 17:13
topicFilter是个变量,问题可能出现在这个上面。我改动如下:
                MessageHandlers handler;
                handler.top ...

你这样写有报错吗?
 楼主| hanfei08131106 发表于 2017-5-4 11:18 | 显示全部楼层
yearnext 发表于 2017-5-3 17:35
你这样写有报错吗?

没有报错,可以过。
 楼主| hanfei08131106 发表于 2017-5-4 15:35 | 显示全部楼层
yearnext 发表于 2017-5-3 17:17
楼主方便发一下工程吗?
从语法角度来说楼主这么写没什么问题

文件太大,不好上传,加我QQ826097857
@若水 发表于 2017-5-4 16:28 | 显示全部楼层
#include "stdio.h"

//--------------------------------第一个结构体定义----------------------------------------------------------
/*******************************************
* 消息处理回调函数数据结构
*******************************************/
typedef struct MessageData
{
    unsigned char* message;   //mqtt消息结构体
    unsigned char* topicName;  //订阅的主题topic
}MessageData;
//--------------------------------第二个结构体定义----------------------------------------------------------
/*******************************************
* 订阅主题对应的消息处理结构
*******************************************/
typedef struct MessageHandlers
{
    const char* topicFilter;      //pub消息对应的主题
    void (*fp) (MessageData*);    //pub消息处理函数
}MessageHandlers;
//--------------------------------在函数内定义使用时----------------------------------------------------------

char topicFilter = 0;

void main(void)
{
        MessageHandlers handler = {(const char *)&topicFilter,NULL};
       
        printf("Hello!");
       
        return;
}


以上是我的测试代码,编译运行都没错
zhenxizhou 发表于 2017-5-4 16:50 | 显示全部楼层
别纠结了,编译器的问题,把这个文件属性从“C source file”改成“C++ source file”就不会报这个错了
 楼主| hanfei08131106 发表于 2017-5-4 17:06 | 显示全部楼层
zhenxizhou 发表于 2017-5-4 16:50
别纠结了,编译器的问题,把这个文件属性从“C source file”改成“C++ source file”就不会报这个错了 ...

已经解决了,在MDK5配置--c99,就可以支持这个格式了。
天风立马 发表于 2017-5-4 19:09 | 显示全部楼层
不是C99也能支持的,你赋值的时候,数据类型要匹配上才行。变量跟常量的生效时间是有先后顺序的。编译器也提示你了:表达式必须是常量。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:适应环境,不要让环境去适应你、、

5

主题

144

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部