如何访问存储函数指针返回值的结构成员的值?

发布于 2025-02-11 15:55:12 字数 1494 浏览 2 评论 0原文

我有以下结构定义:

typedef struct S_t S_t;

struct S_t {
    float *s_ptr;
    uint32_t ns;
};

typedef struct p_t p_t;

struct p_t {
    int32_t pID;
    float pVal;
};


typedef struct pr_t pr_t;

struct pr_t {
    S_t *S;
    int (*TrimS)(S_t *TS, int sSize);
    p_t *TP;
};

我还定义了以下函数:

int success = 0;
int failure = -1;

int ChopS(S_t *TS, int size)
{
    int i, c;
    for(i = 0; i < TS->ns; i++)
    {
        if (i >= size)
            TS->s_ptr[i] = 0.0;
    }
    c = 0;
    for(i = 0; i < TS->ns; i++)
    {
    if(TS->s_ptr[i] == 0.0)
        c++;
    }
    if (c == size)
    return success;
    else
    return failure;
}

我执行以下(完整代码 s onery )为pr_t的每个成员分配值,其成员为trims这是一个状态标志函数指针:

    p_t *p2 = NULL;
    S_t *tS2 = NULL;
    tS2 = malloc(sizeof(S_t));
    
    pr_t *SP2 = NULL;
    SP2 = malloc(sizeof(pr_t));

    p2 = (p_t *) malloc(sizeof(p_t));

    SP2->S = tS2;
    SP2->TP = p2;
    SP2->TrimS = ChopS;
    SP2->TrimS(tS2, 8);

如果我尝试使用sp2-&gt; trims访问标志的值,我会得到垃圾值(或我认为的地址值),但不是> 0-1正如我所期望的。这里到底发生了什么?如何在sp2-&gt; trims中访问chops设置的值?

I have the following structure definitions:

typedef struct S_t S_t;

struct S_t {
    float *s_ptr;
    uint32_t ns;
};

typedef struct p_t p_t;

struct p_t {
    int32_t pID;
    float pVal;
};


typedef struct pr_t pr_t;

struct pr_t {
    S_t *S;
    int (*TrimS)(S_t *TS, int sSize);
    p_t *TP;
};

I also have the following function defined:

int success = 0;
int failure = -1;

int ChopS(S_t *TS, int size)
{
    int i, c;
    for(i = 0; i < TS->ns; i++)
    {
        if (i >= size)
            TS->s_ptr[i] = 0.0;
    }
    c = 0;
    for(i = 0; i < TS->ns; i++)
    {
    if(TS->s_ptr[i] == 0.0)
        c++;
    }
    if (c == size)
    return success;
    else
    return failure;
}

I do the following (full code here) to assign values to each member of type pr_t, one of whose member is TrimS which is a status flag function pointer:

    p_t *p2 = NULL;
    S_t *tS2 = NULL;
    tS2 = malloc(sizeof(S_t));
    
    pr_t *SP2 = NULL;
    SP2 = malloc(sizeof(pr_t));

    p2 = (p_t *) malloc(sizeof(p_t));

    SP2->S = tS2;
    SP2->TP = p2;
    SP2->TrimS = ChopS;
    SP2->TrimS(tS2, 8);

If I try to access the value of the flag using SP2->TrimS, I get a junk value (or an address value I think) but not 0 or -1 as I expect. What is exactly happening over here? How can I access the value set by ChopS in SP2->TrimS?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

呆° 2025-02-18 15:55:13

您需要调用该功能以获取返回值。它没有存储在任何地方,功能指针不会存储最后一个返回值。将其用作任何“正常”功能

if(SP2->TrimS(tS2, 8) == failure)
{
    /* do something */
}
else
{
    /* do something else */
}

,或者如果要以后(通话后)访问它,则需要将其存储在变量中,或者有一个附加的结构成员来存储它:

struct pr_t {
    S_t *S;
    int (*TrimS)(S_t *, int);
    int last_TrimS_Return_Value;
    p_t *TP;
};

/* .... */

SP2 -> last_TrimS_Return_Value = SP2->TrimS(tS2, 8);

You need to call the function to get the return value. It is not stored anywhere and the function pointer does not store the last return value. Use it as any "normal" function

if(SP2->TrimS(tS2, 8) == failure)
{
    /* do something */
}
else
{
    /* do something else */
}

or if you want to access it later (after the call) you need to store it in the variable or have an additional struct member to store it:

struct pr_t {
    S_t *S;
    int (*TrimS)(S_t *, int);
    int last_TrimS_Return_Value;
    p_t *TP;
};

/* .... */

SP2 -> last_TrimS_Return_Value = SP2->TrimS(tS2, 8);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文