arrays - CS50 Pset4 边缘编码 - 类型“RGBTRIPLE [宽度]”的索引 601 错误超出范围
问题描述
对于 CS50 Pset4 过滤器边缘部分,https: //cs50.harvard.edu/x/2020/psets/4/filter/more/我有下面的代码,它返回错误
helpers.c:205:216:运行时错误:索引 601 超出类型“RGBTRIPLE [宽度]”的范围
在行
RGBTRIPLE array[] = {larger_image[i][j], larger_image[i][j + 1], larger_image[i][j + 2],
larger_image[i + 1][j], larger_image[i + 1][j + 1], larger_image[i + 1][j + 2],
larger_image[i + 2][j], larger_image[i + 2][j + 1], larger_image[i + 2][j + 2]};
我的代码的逻辑是创建一个新图像,larger_image,其轮廓为零 RGB 值。这样,就可以很容易地计算出sobel算子。然后我创建另一个类型为 RGBTRIPLE 的 9 个元素的数组,这样我就可以循环添加他盒子的 sumproduct。但是错误来了,我检查了 i 和 j 边界,看起来还可以...
有人可以帮我看看为什么这里的数组有错误吗?
void edges(int height, int width, RGBTRIPLE image[height][width])
{
RGBTRIPLE(*edged)[width] = calloc(height, (width) * sizeof(RGBTRIPLE));
**// create another mirror image with size of height +2 and width + 2 of outline RGB numbers zero**
RGBTRIPLE(*larger_image)[width] = calloc(height + 2, (width + 2) * sizeof(RGBTRIPLE));
int i =0;
int j = 0;
float blue_final, green_final, red_final;
for (i = 1; i < height +1; i++)
{
for (j = 1; j < width + 1; j++)
{
larger_image[i][j] = image[i-1][j-1];
}
}
int gx[] = {-1, 0, 1, -2, 0, 2, -1, 0, 1};
int gy[] = {-1, -2, -1, 0, 0, 0, 1, 2, 1};
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
int blue_x = 0, blue_y = 0, green_x = 0, green_y = 0, red_x = 0, red_y = 0;
**//create an array of 9 elements easier for me to loop the sumproduct with gx/gy below, error here.**
RGBTRIPLE array[] = {larger_image[i][j], larger_image[i][j + 1], larger_image[i][j + 2],
larger_image[i + 1][j], larger_image[i + 1][j + 1], larger_image[i + 1][j + 2],
larger_image[i + 2][j], larger_image[i + 2][j + 1], larger_image[i + 2][j + 2]};
for (int k = 0; k < 9; k++)
{
blue_x += array[k].rgbtBlue * gx[k];
blue_y += array[k].rgbtBlue * gy[k];
green_x += array[k].rgbtGreen * gx[k];
green_y += array[k].rgbtGreen * gy[k];
red_x += array[k].rgbtRed * gx[k];
red_y += array[k].rgbtRed * gy[k];
}
blue_final = sqrt(pow(blue_x, 2) + pow(blue_y, 2));
if(blue_final > 255.0)
{
blue_final = 255.0;
}
red_final = sqrt(pow(red_x, 2) + pow(red_y, 2));
if(red_final > 255.0)
{
red_final = 255.0;
}
green_final = sqrt(pow(green_x, 2) + pow(green_y, 2));
if(green_final > 255.0)
{
green_final = 255.0;
}
edged[i][j].rgbtBlue = round(blue_final);
edged[i][j].rgbtGreen = round(green_final);
edged[i][j].rgbtRed = round(red_final);
}
}
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
image[i][j] = edged[i][j];
}
}
return;
}
解决方案
您尝试创建一个包含多个width*hight
元素的数组:
RGBTRIPLE(*larger_image)[width] = calloc(height + 2, (width + 2) * sizeof(RGBTRIPLE));
此分配可能为此目的保留足够的内存,但与变量的类型不匹配。
larger_image
是指向元素数组的指针width
,无论您分配多少内存。
您的运行时检查检测到您访问索引width+1
并打印错误。
要使其工作,您需要使用
RGBTRIPLE(*larger_image)[width+2] = calloc(height + 2, (width + 2) * sizeof(RGBTRIPLE));
推荐阅读
- r - 对日期列进行排序并将 csv 文件转换为时间序列
- javascript - 如何在 css 中使用 javascript 变量?
- android - Google Play 拒绝应用,因为它正在上传用户的联系信息
- powershell - 格式化 UTC 时间
- node.js - 使用 Heroku 和 Google 域配置子域?
- java - 在 java 8 上迭代值
- mysql - NodeJS MySQL,在连接丢失时重新连接?
- visual-studio-code - Visual Studio 代码蓝块
- python - 如何在 URL 中搜索特定文本
- python - 显示数字是否在 pandas 中最多 3 个位置是连续的