我想用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;
}
Author: https://gist.github.com/ndiecodes
第二個問題是——為什么不需要指針。我的意思是,在講課中有一些信息,我們需要在需要更改元素值的情況下使用指針。這個函數沒有返回任何值-它只是VOID-所以我很好奇為什么第二個代碼工作正常
使用while循環的代碼不會在循環后將
j
重置回零。因此,在第一行之后,不會對數組的每一行執行任何操作。其次,這里沒有顯式的指針,但是C數組被有效地傳遞,就好像(松散地說)它們是指向數據的指針一樣,因此您對
image
的訪問會影響調用者看到的數據。