打印
[C语言]

结构体的声明和赋值问题

[复制链接]
2056|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
--------------------------------第一个结构体定义----------------------------------------------------------
/*******************************************
* 消息处理回调函数数据结构
*******************************************/
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;
不知道是不是可以?

使用特权

评论回复
5
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;

楼主方便发一下工程吗?
从语法角度来说楼主这么写没什么问题

使用特权

评论回复
6
yearnext| | 2017-5-3 17:19 | 只看该作者
hanfei08131106 发表于 2017-5-3 17:13
topicFilter是个变量,问题可能出现在这个上面。我改动如下:
                MessageHandlers handler;
                handler.top ...

要注意handler.topicFilter是由const修饰的

使用特权

评论回复
7
hanfei08131106|  楼主 | 2017-5-3 17:27 | 只看该作者
yearnext 发表于 2017-5-3 17:17
楼主方便发一下工程吗?
从语法角度来说楼主这么写没什么问题

我移植的阿里云的SDK到UCOS平台,还有最后一个问题,解决后公布。你在做相关的项目吗?

使用特权

评论回复
8
yearnext| | 2017-5-3 17:31 | 只看该作者
hanfei08131106 发表于 2017-5-3 17:27
我移植的阿里云的SDK到UCOS平台,还有最后一个问题,解决后公布。你在做相关的项目吗? ...

没有,我只是好奇代码报错的原因

使用特权

评论回复
9
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};
}


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

使用特权

评论回复
10
yearnext| | 2017-5-3 17:34 | 只看该作者
yearnext 发表于 2017-5-3 17:33
我修改成这样编译没有报错

猜测可能是由别的原因导致的报错

使用特权

评论回复
11
yearnext| | 2017-5-3 17:35 | 只看该作者
hanfei08131106 发表于 2017-5-3 17:13
topicFilter是个变量,问题可能出现在这个上面。我改动如下:
                MessageHandlers handler;
                handler.top ...

你这样写有报错吗?

使用特权

评论回复
12
hanfei08131106|  楼主 | 2017-5-4 11:18 | 只看该作者
yearnext 发表于 2017-5-3 17:35
你这样写有报错吗?

没有报错,可以过。

使用特权

评论回复
13
hanfei08131106|  楼主 | 2017-5-4 15:35 | 只看该作者
yearnext 发表于 2017-5-3 17:17
楼主方便发一下工程吗?
从语法角度来说楼主这么写没什么问题

文件太大,不好上传,加我QQ826097857

使用特权

评论回复
14
@若水| | 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;
}


以上是我的测试代码,编译运行都没错

使用特权

评论回复
15
zhenxizhou| | 2017-5-4 16:50 | 只看该作者
别纠结了,编译器的问题,把这个文件属性从“C source file”改成“C++ source file”就不会报这个错了

使用特权

评论回复
16
hanfei08131106|  楼主 | 2017-5-4 17:06 | 只看该作者
zhenxizhou 发表于 2017-5-4 16:50
别纠结了,编译器的问题,把这个文件属性从“C source file”改成“C++ source file”就不会报这个错了 ...

已经解决了,在MDK5配置--c99,就可以支持这个格式了。

使用特权

评论回复
17
天风立马| | 2017-5-4 19:09 | 只看该作者
不是C99也能支持的,你赋值的时候,数据类型要匹配上才行。变量跟常量的生效时间是有先后顺序的。编译器也提示你了:表达式必须是常量。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

5

主题

144

帖子

1

粉丝