【发布时间】:2021-10-26 13:11:18
【问题描述】:
我正在尝试用 CS50 制作灰度滤镜。
首先 - 为什么我的代码无法运行,而我在 GitHub 上找到的与我相似的代码运行良好。
这是我的代码:
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
int i = 0, j = 0;
float rgbGray;
while (i < height)
{
while (j < width)
{
rgbGray = (image[i][j].rgbtBlue + image[i][j].rgbtGreen + image[i][j].rgbtRed) / 3.00;
rgbGray = round(rgbGray);
image[i][j].rgbtBlue = rgbGray;
image[i][j].rgbtGreen = rgbGray;
image[i][j].rgbtRed = rgbGray;
j++;
}
i++;
}
return;
}
这是我在 GitHub 上找到的工作代码
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
float rgbGray;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++) {
rgbGray = round( (image[i][j].rgbtBlue + image[i][j].rgbtGreen + image[i][j].rgbtRed)/ 3.00);
image[i][j].rgbtBlue = rgbGray;
image[i][j].rgbtGreen = rgbGray;
image[i][j].rgbtRed = rgbGray;
}
}
return;
}
作者:https://gist.github.com/ndiecodes
第二个问题是 - 为什么不需要指针。我的意思是在讲座中有信息,我们需要在想要更改元素值的情况下使用指针。这个函数没有返回任何值——它只是 VOID——所以我很好奇为什么第二个代码可以正常工作
【问题讨论】:
-
您需要在第一个循环中每次将
j初始化为0。否则j将在i为0 时到达width,之后内部循环将永远不会执行 -
天哪。谢谢你!那是菜鸟的错误
-
不需要在函数开头声明变量。在您需要的地方声明它们可以避免这个问题。
-
RGBTRIPLE的定义在哪里?rgbtBlue、rgbtGreen和rgbtRed有哪些数据类型?在这部分你可能会面临整数溢出的风险:image[i][j].rgbtBlue + image[i][j].rgbtGreen + image[i][j].rgbtRed