Предположим, что если определить структуру как и определить массив:
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.
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;
Вместо отдельных членов структуры используйте один член, являющийся массивом, например:
enum { RED, GREEN, BLUE };
typedef struct {
BYTE component[3];
} RGBTRIPLE;
// ...
channel = GREEN;
foo.component[channel] = 255;
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.