在C中使用括号中的变量是否可以访问结构体成员?



我正在CS50任务中工作,我应该创建图像过滤器。我已经写了代码,它工作并通过了所有测试。然而,在我看来,模糊滤镜中的部分代码设计得并不好。我复制粘贴了一个代码块三次,而不是循环它。我试过循环,但没能算出来。基本想动态访问结构体成员。

结构:

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

从struct创建的图像:

RGBTRIPLE image[height][width]

如下所示,我在循环中有三个几乎相同的代码块。区别在于结构体成员的名称"rgbtRed"one_answers"rgbtGreen","rgbtBlue".

for (int k = 0; k < 3; k++)
{
// array to put our values in
int sqr[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1 };
int tempSum = 0;
if (k == 0)
{
if (i > 0)
{
sqr[0] = j > 0 ? image[i - 1][j - 1].rgbtRed : -1;
sqr[1] = image[i - 1][j].rgbtRed;
sqr[2] = j < width - 1 ? image[i - 1][j + 1].rgbtRed : -1;
}
sqr[3] = j > 0 ? image[i][j - 1].rgbtRed : -1;
sqr[4] = image[i][j].rgbtRed;
sqr[5] = j < width - 1 ? image[i][j + 1].rgbtRed : -1;
if (i < (height - 1))
{
sqr[6] = j > 0 ? image[i + 1][j - 1].rgbtRed : -1;
sqr[7] = image[i + 1][j].rgbtRed;
sqr[8] = j < width - 1 ? image[i + 1][j + 1].rgbtRed : -1;
}
}
else if (k == 1)
{
if (i > 0)
{
sqr[0] = j > 0 ? image[i - 1][j - 1].rgbtGreen : -1;
sqr[1] = image[i - 1][j].rgbtGreen;
sqr[2] = j < width - 1 ? image[i - 1][j + 1].rgbtGreen : -1;
}
sqr[3] = j > 0 ? image[i][j - 1].rgbtGreen : -1;
sqr[4] = image[i][j].rgbtGreen;
sqr[5] = j < width - 1 ? image[i][j + 1].rgbtGreen : -1;
if (i < (height - 1))
{
sqr[6] = j > 0 ? image[i + 1][j - 1].rgbtGreen : -1;
sqr[7] = image[i + 1][j].rgbtGreen;
sqr[8] = j < width - 1 ? image[i + 1][j + 1].rgbtGreen : -1;
}
}
else if (k == 2)
{
if (i > 0)
{
sqr[0] = j > 0 ? image[i - 1][j - 1].rgbtBlue : -1;
sqr[1] = image[i - 1][j].rgbtBlue;
sqr[2] = j < width - 1 ? image[i - 1][j + 1].rgbtBlue : -1;
}
sqr[3] = j > 0 ? image[i][j - 1].rgbtBlue : -1;
sqr[4] = image[i][j].rgbtBlue;
sqr[5] = j < width - 1 ? image[i][j + 1].rgbtBlue : -1;
if (i < (height - 1))
{
sqr[6] = j > 0 ? image[i + 1][j - 1].rgbtBlue : -1;
sqr[7] = image[i + 1][j].rgbtBlue;
sqr[8] = j < width - 1 ? image[i + 1][j + 1].rgbtBlue : -1;
}
}
// sum temp.
float divider = 0.0;
for (int l = 0; l < 9; l++)
{
if (sqr[l] >= 0 && sqr[l] <= 255)
{
tempSum = tempSum + sqr[l];
divider++;
}
}
// calulate average color for each
avgRGB[k] = round(tempSum / divider);
}

我尝试创建动态名称作为变量使用:

if (k == 0)
{
char *color = "rgbtRed";
} else if (k == 1)
char...

然后使用该变量作为动态名访问带有括号[]而不是(.)的结构体成员,如下所示:

...image[i][j][color];

然而,这不起作用,因为我是C语言的新手,我将非常感谢一些指导来改进我的代码。

祝你一切顺利!

可以使RBGTRIPLE为匿名结构体与3元素数组的联合。

typedef union {
struct {
BYTE  rgbtBlue;
BYTE  rgbtGreen;
BYTE  rgbtRed;
} __attribute__((__packed__))
BYTE rbgt[3];
} RGBTRIPLE;

现在您可以访问图像的单个组件作为image[y][x].rgbt[1]而不是image[y][x].rgbtGreen

现在你可以用一个case替换if (k == ...) { ... } else的重复链:

if (i > 0) {
sqr[0] = j > 0 ? image[i - 1][j - 1].rgbt[k] : -1;
sqr[1] = image[i - 1][j].rgbt[k];
sqr[2] = j < width - 1 ? image[i - 1][j + 1].rgbt[k] : -1;
}
sqr[3] = j > 0 ? image[i][j - 1].rgbt[k] : -1;
sqr[4] = image[i][j].rgbt[k];
sqr[5] = j < width - 1 ? image[i][j + 1].rgbt[k] : -1;
if (i < (height - 1)) {
sqr[6] = j > 0 ? image[i + 1][j - 1].rgbt[k] : -1;
sqr[7] = image[i + 1][j].rgbt[k];
sqr[8] = j < width - 1 ? image[i + 1][j + 1].rgbt[k] : -1;
}

相关内容

  • 没有找到相关文章

最新更新