我正在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;
}