【问题标题】:Is it possible to make a variable which can take the value of different values defined in a structure in C?是否可以创建一个变量来获取 C 结构中定义的不同值的值?
【发布时间】:2020-11-15 19:22:16
【问题描述】:

假设如果定义一个结构为并定义一个数组:

typedef struct
{
    BYTE  rgbtRed;
    BYTE  rgbtGreen;
    BYTE  rgbtBlue;
} __attribute__((__packed__))
RGBTRIPLE;

是否可以制作一个可以取 rgbtBlue / rbgtGreen / rgbtRed 值的变量?

喜欢:

int main()
{
    RGBTRIPLE image[2];
    VARIABLE = ??;
    RGBTRIPLE image_1[0].VARIABLE = func(image[0].VARIABLE);
}

RGBTRIPLE func(RGBTRIPLE image[0].VARIABLE)
{
    image[0].VARIABLE = 255;
    return image[0].VARIABLE;
}

我想创建一个函数,它可以输入 image[0].rgbtRed、image[0].rgbtGreen 和 image[0].rgbtBlue,然后单独修改这些值。在这里,目标是将所有值更改为 255 以在我不知道如何定义的 VARIABLE 的帮助下制作一个白色像素。基本上,我希望变量引用已经定义的结构,首先获取 rgbtRed 的值,然后是 rgbtGreen,最后是 rgbtBlue。

【问题讨论】:

  • 不清楚你在做什么。请修改问题以显示您知道如何执行的 3 个单独的功能,并询问是否有更好的方法。
  • 除非该函数需要同时知道其他两个组件的值,否则您可以拥有image[0].rgbtRed = myFunc(image[0].rgbtRed);并依次处理每个组件。
  • 使用一个数组成员,而不是单个结构成员。

标签: c variables optimization struct


【解决方案1】:

使用单个成员作为数组,而不是单个结构成员,如下所示:

enum { RED, GREEN, BLUE };

typedef struct {
    BYTE component[3];
} RGBTRIPLE;

// ...

channel = GREEN;
foo.component[channel] = 255;

【讨论】:

  • 是否可以在不改变结构的情况下做到这一点?我已经使用了相同的结构应用了其他一些过滤器。
  • 您可以使用offsetof 和指针算法的复杂舞蹈,但如果您弄错了,您就有了UB。请参阅约瑟夫的回答。
【解决方案2】:

您基本上是在询问如何将 C++ 的指针复制到 C 中的成员。您可以围绕 offsetof 宏构建它,如下所示:

#include <stddef.h>

const size_t RED = offsetof(RGBTRIPLE, rgbtRed);
const size_t GREEN = offsetof(RGBTRIPLE, rgbtGreen);
const size_t BLUE = offsetof(RGBTRIPLE, rgbtBlue);

#define VARIABLECOLOR(x, color) (*(BYTE *)((char *)&(x) + (color)))

并像这样使用它:

RGBTRIPLE image[2];
size_t color = RED;
VARIABLECOLOR(image[0], color) = 255;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-23
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2016-03-04
    相关资源
    最近更新 更多