【问题标题】:C passing structure to a callback function (Tizen)C 将结构传递给回调函数 (Tizen)
【发布时间】:2021-02-14 16:58:27
【问题描述】:

我正在为 Tizen(智能手表)编写应用程序。无法将结构传递给回调。 我的类型定义:

typedef struct _Health {
    ...;
    const char *data;
} health_s;

声明一个结构并初始化它:

health_s health = {
    ...,
    .data = "steps"
};

将其传递给函数:

_app_check_and_request_permission("http://tizen.org/privilege/healthinfo", &health);

获取并检查结构地址是否通过:

void _app_check_and_request_permission(const char *privilege, void *user_data)
{
    health_s *p_health = user_data;
    dlog_print(DLOG_INFO, LOG_TAG, "Health data: %s", p_health->data);
    ...

我在日志中看到“健康数据:步骤”。顺利通过。然后我试图将 user_data 传递给回调函数

    ...
    ppm_request_permission(privilege, _app_request_response_cb, p_health);
}

来自 Tizen 文档中的函数描述:

...
* @param[in]   user_data   User specific data which will be passed to
*                          the given callback.
int ppm_request_permission(const char *privilege,
                           ppm_request_response_cb callback,
                           void *user_data);

回调声明:

static void _app_request_response_cb(ppm_call_cause_e cause, ppm_request_result_e result,
                             const char *privilege, void *user_data);

在回调中我得到健康数据:NULL。试图将 p_health->data 传递给回调,这没关系。问题在于通过整个结构。 我究竟做错了什么?谢谢。 更新: 在 _app_check_and_request_permission 函数和回调中检查了传递结构的地址,它们是相同的。但是回调中的struct还是空的……

【问题讨论】:

  • 通常你会尝试传递一个指针到一个结构...
  • @user9160119 - 您是否使用静态存储持续时间定义了health,或者至少您确定health 的生命周期会延长到回调点?
  • @Armali 不,health 未定义为静态。不确定health 的生命周期。将尝试以某种方式解决这个问题。谢谢!

标签: c callback tizen


【解决方案1】:

在请求完成时系统调用_app_request_response_cb 之前,health 的生命周期可能已经结束。例如,如果health 的所示定义包含在请求完成之前返回的函数中,就会出现这种情况。简单的补救措施:使用存储类 static 定义 health

【讨论】:

  • 再次感谢!你完全正确! health 是在 app_create 函数中创建的,该函数在回调之前完成。将health 定义为静态,并且工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2021-03-17
  • 2013-04-12
  • 2015-01-03
  • 2012-10-06
相关资源
最近更新 更多