Предположим, что если определить структуру как и определить массив:

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, чтобы сделать белый пиксель с помощью ПЕРЕМЕННОЙ, которую я не знаю, как определить. По сути, я хочу, чтобы переменная ссылалась на уже определенную структуру и сначала принимала значение rgbtRed, затем rgbtGreen и, наконец, rgbtBlue.

1
Psi 15 Ноя 2020 в 22:22

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;
0
Joseph Sible-Reinstate Monica 15 Ноя 2020 в 20:30

Вместо отдельных членов структуры используйте один член, являющийся массивом, например:

enum { RED, GREEN, BLUE };

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

// ...

channel = GREEN;
foo.component[channel] = 255;
1
R.. GitHub STOP HELPING ICE 15 Ноя 2020 в 19:52