改变RBG值并不意味着';他似乎不在C语言中工作

改变RBG值并不意味着';他似乎不在C语言中工作,c,cs50,C,Cs50,我应该通过获得3个颜色的平均值,然后将该平均值分配给每个RBG颜色(红色、蓝色、绿色),将RGB颜色更改为灰色,但它不起作用 首先,我将发布灰度部分的代码: #include "helpers.h" // Convert image to grayscale void grayscale(int height, int width, RGBTRIPLE image[height][width]) { for(int i = 0; i < height; i++)

我应该通过获得3个颜色的平均值,然后将该平均值分配给每个RBG颜色(红色、蓝色、绿色),将RGB颜色更改为灰色,但它不起作用

首先,我将发布灰度部分的代码:

#include "helpers.h"

// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
   for(int i = 0; i < height; i++)
   {
     for(int j = 0; j < width; j++)
     {
       RGBTRIPLE rgbt = image[i][j];
       BYTE average = (rgbt.rgbtBlue/3)+(rgbt.rgbtGreen/3)+(rgbt.rgbtRed);
       *rgbt.rgbtBlue = *average;
       *rgbt.rgbtGreen = *average;
       *rgbt.rgbtRed = *average;
     }        
   }
   return;
}
错误消息如下所示:

间接寻址需要指针操作数('int'无效)

谢谢你的帮助(我知道cs50不是最好的课程,但哈佛文凭很有帮助!)。

我想你想要这个:

void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
   for(int i = 0; i < height; i++)
   {
     for(int j = 0; j < width; j++)
     {
       RGBTRIPLE rgbt = image[i][j];
       BYTE average = (rgbt.rgbtBlue + rgbt.rgbtGreen + rgbt.rgbtRed) / 3;
       rgbt.rgbtBlue = average;
       rgbt.rgbtGreen = average;
       rgbt.rgbtRed =  average;
       image[i][j] = rgbt;   
     }        
   }
   return;
}
因为您没有将
rgbt.rgbtRed
除以3,而且无论如何,您应该首先添加所有值,然后将整个值除以3,这将防止舍入错误:

BYTE average = (rgbt.rgbtBlue + rgbt.rgbtGreen + rgbt.rgbtRed) / 3;
这是错误的,您可以使用
*
取消对非指针的引用:

 *rgbt.rgbtBlue = *average;
你只需要:

 rgbt.rgbtBlue = average;
最后但并非最不重要的一点是,您仍然需要通过添加以下内容来修改图像中的原始值:

 image[i][j] = rgbt;
我想你想要这个:

void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
   for(int i = 0; i < height; i++)
   {
     for(int j = 0; j < width; j++)
     {
       RGBTRIPLE rgbt = image[i][j];
       BYTE average = (rgbt.rgbtBlue + rgbt.rgbtGreen + rgbt.rgbtRed) / 3;
       rgbt.rgbtBlue = average;
       rgbt.rgbtGreen = average;
       rgbt.rgbtRed =  average;
       image[i][j] = rgbt;   
     }        
   }
   return;
}
因为您没有将
rgbt.rgbtRed
除以3,而且无论如何,您应该首先添加所有值,然后将整个值除以3,这将防止舍入错误:

BYTE average = (rgbt.rgbtBlue + rgbt.rgbtGreen + rgbt.rgbtRed) / 3;
这是错误的,您可以使用
*
取消对非指针的引用:

 *rgbt.rgbtBlue = *average;
你只需要:

 rgbt.rgbtBlue = average;
最后但并非最不重要的一点是,您仍然需要通过添加以下内容来修改图像中的原始值:

 image[i][j] = rgbt;

BYTE
不是指针AFAIK。您不能取消对它的引用。
(rgbt.rgbtRed)
->
(rgbt.rgbtRed/3)
为什么要到处添加一元运算符
*
?你认为它是干什么的?
*rgbt.rgbtBlue
->
rgbt.rgbtBlue
(几个地方)
*平均值
->
平均值
(几个地方)
字节
不是指针。您不能取消对它的引用。
(rgbt.rgbtRed)
->
(rgbt.rgbtRed/3)
为什么要到处添加一元运算符
*
?你认为它能做什么?
*rgbt.rgbtBlue
->
rgbt.rgbtBlue
(几个地方)
*average
->
average
(几个地方)正常,但它告诉我“无法打开infle.bmp.”?(非常抱歉,我真的很烂:D)“无法打开infle.bmp.”,很可能意味着该文件不存在。文件名可能区分大小写,或者您的平台或文件在您认为的位置不存在。这是一个全新的问题。是的,我犯了一个愚蠢的错误,复制了代码前的空格,谢谢!我可以在这里问一个后续问题吗<代码>代码字节sepired=.393*rgbt.rgbtRed+.769*rgbt.rgbtGreen+.189*rgbt.rgbtBlue<代码>代码有错误信息;“259.821不在“unsigned char”类型的可表示值的范围内@Ragnaroni颜色值范围从0到255。您需要确保您的结果符合此范围。提示:应用基础学校数学。好的,它正在运行,但它告诉我“无法打开infle.bmp。”?(非常抱歉,我真的很烂:D)“无法打开infle.bmp.”,很可能意味着该文件不存在。文件名可能区分大小写,或者您的平台或文件在您认为的位置不存在。这是一个全新的问题。是的,我犯了一个愚蠢的错误,复制了代码前的空格,谢谢!我可以在这里问一个后续问题吗<代码>代码字节sepired=.393*rgbt.rgbtRed+.769*rgbt.rgbtGreen+.189*rgbt.rgbtBlue<代码>代码有错误信息;“259.821不在“unsigned char”类型的可表示值的范围内@Ragnaroni颜色值范围从0到255。您需要确保您的结果符合此范围。提示:应用基础学校数学。