I got some weird issue with my code! It compiles without any problems. All other filters work perfectly, and check50 shows no problems (no problem in edge according to check50). But, when i try edge filter on any of the sample images I get the following result.
~/pset4/filter/ $ ./filter -e images/tower.bmp out.bmp
UndefinedBehaviorSanitizer:DEADLYSIGNAL
==12056==ERROR: UndefinedBehaviorSanitizer: stack-overflow on address 0x7fff30f8be50 (pc 0x00000044afea bp 0x7fff317d4a10 sp 0x7fff30f8be50 T12056)
#0 0x44afe9 (/home/ubuntu/pset4/filter/filter+0x44afe9)
#1 0x42330e (/home/ubuntu/pset4/filter/filter+0x42330e)
#2 0x7f6d3cca7b96 (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
#3 0x402e19 (/home/ubuntu/pset4/filter/filter+0x402e19)
==12056==ABORTING
and with that i get an unreadable output file.
following is my code for helper.c file.
#include "helpers.h"
#include <math.h>
//float duplicate of RGBTRIPLE
typedef struct
{
float Red;
float Green;
float Blue;
}
Image;
/*
Extra code cropped
*/
// Detect edges
/*
This is where the problem lies.
Code checks out with success on check50 but shows weird error message when i run it.
*/
void edges(int height, int width, RGBTRIPLE image[height][width])
{
//initialize 3 different arrays for later use
Image edge[height][width];
Image gx[height][width];
Image gy[height][width];
//loop to get values of gx and gy
for (int a = 0; a < height; a++)
{
for (int b = 0; b < width; b++)
{
//for top row
if (a == 0)
{
//top left corner
if (b == 0)
{
gx[a][b].Red = (((image[a][b].rgbtRed * (0)) + (image[a][b + 1].rgbtRed * (2)))
+ ((image[a + 1][b].rgbtRed * (0)) + (image[a + 1][b + 1].rgbtRed * (1))));
gx[a][b].Green = (((image[a][b].rgbtGreen * (0)) + (image[a][b + 1].rgbtGreen * (2)))
+ ((image[a + 1][b].rgbtGreen * (0)) + (image[a + 1][b + 1].rgbtGreen * (1))));
gx[a][b].Blue = (((image[a][b].rgbtBlue * (0)) + (image[a][b + 1].rgbtBlue * (2)))
+ ((image[a + 1][b].rgbtBlue * (0)) + (image[a + 1][b + 1].rgbtBlue * (1))));
gy[a][b].Red = (((image[a][b].rgbtRed * (0)) + (image[a][b + 1].rgbtRed * (0)))
+ ((image[a + 1][b].rgbtRed * (2)) + (image[a + 1][b + 1].rgbtRed * (1))));
gy[a][b].Green = (((image[a][b].rgbtGreen * (0)) + (image[a][b + 1].rgbtGreen * (0)))
+ ((image[a + 1][b].rgbtGreen * (2)) + (image[a + 1][b + 1].rgbtGreen * (1))));
gy[a][b].Blue = (((image[a][b].rgbtBlue * (0)) + (image[a][b + 1].rgbtBlue * (0)))
+ ((image[a + 1][b].rgbtBlue * (2)) + (image[a + 1][b + 1].rgbtBlue * (1))));
}
//top right corner
else if (b == (width - 1))
{
gx[a][b].Red = (((image[a][b - 1].rgbtRed * (-2)) + (image[a][b].rgbtRed * (0)))
+ ((image[a + 1][b - 1].rgbtRed * (-1)) + (image[a + 1][b].rgbtRed * (0))));
gx[a][b].Green = (((image[a][b - 1].rgbtGreen * (-2)) + (image[a][b].rgbtGreen * (0)))
+ ((image[a + 1][b - 1].rgbtGreen * (-1)) + (image[a + 1][b].rgbtGreen * (0))));
gx[a][b].Blue = (((image[a][b - 1].rgbtBlue * (-2)) + (image[a][b].rgbtBlue * (0)))
+ ((image[a + 1][b - 1].rgbtBlue * (-1)) + (image[a + 1][b].rgbtBlue * (0))));
gy[a][b].Red = (((image[a][b - 1].rgbtRed * (0)) + (image[a][b].rgbtRed * (0)))
+ ((image[a + 1][b - 1].rgbtRed * (1)) + (image[a + 1][b].rgbtRed * (2))));
gy[a][b].Green = (((image[a][b - 1].rgbtGreen * (0)) + (image[a][b].rgbtGreen * (0)))
+ ((image[a + 1][b - 1].rgbtGreen * (1)) + (image[a + 1][b].rgbtGreen * (2))));
gy[a][b].Blue = (((image[a][b - 1].rgbtBlue * (0)) + (image[a][b].rgbtBlue * (0)))
+ ((image[a + 1][b - 1].rgbtBlue * (1)) + (image[a + 1][b].rgbtBlue * (2))));
}
//rest of the top row
else
{
gx[a][b].Red = (((image[a][b - 1].rgbtRed * (-2)) + (image[a][b].rgbtRed * (0)) + (image[a][b + 1].rgbtRed * (2)))
+ ((image[a + 1][b - 1].rgbtRed * (-1)) + (image[a + 1][b].rgbtRed * (0)) + (image[a + 1][b + 1].rgbtRed * (1))));
gx[a][b].Green = (((image[a][b - 1].rgbtGreen * (-2)) + (image[a][b].rgbtGreen * (0)) + (image[a][b + 1].rgbtGreen * (2)))
+ ((image[a + 1][b - 1].rgbtGreen * (-1)) + (image[a + 1][b].rgbtGreen * (0)) + (image[a + 1][b + 1].rgbtGreen * (1))));
gx[a][b].Blue = (((image[a][b - 1].rgbtBlue * (-2)) + (image[a][b].rgbtBlue * (0)) + (image[a][b + 1].rgbtBlue * (2)))
+ ((image[a + 1][b - 1].rgbtBlue * (-1)) + (image[a + 1][b].rgbtBlue * (0)) + (image[a + 1][b + 1].rgbtBlue * (1))));
gy[a][b].Red = (((image[a][b - 1].rgbtRed * (0)) + (image[a][b].rgbtRed * (0)) + (image[a][b + 1].rgbtRed * (0)))
+ ((image[a + 1][b - 1].rgbtRed * (1)) + (image[a + 1][b].rgbtRed * (2)) + (image[a + 1][b + 1].rgbtRed * (1))));
gy[a][b].Green = (((image[a][b - 1].rgbtGreen * (0)) + (image[a][b].rgbtGreen * (0)) + (image[a][b + 1].rgbtGreen * (0)))
+ ((image[a + 1][b - 1].rgbtGreen * (1)) + (image[a + 1][b].rgbtGreen * (2)) + (image[a + 1][b + 1].rgbtGreen * (1))));
gy[a][b].Blue = (((image[a][b - 1].rgbtBlue * (0)) + (image[a][b].rgbtBlue * (0)) + (image[a][b + 1].rgbtBlue * (0)))
+ ((image[a + 1][b - 1].rgbtBlue * (1)) + (image[a + 1][b].rgbtBlue * (2)) + (image[a + 1][b + 1].rgbtBlue * (1))));
}
}
//bottom layer
else if (a == (height - 1))
{
//bottom left corner
if (b == 0)
{
gx[a][b].Red = (((image[a - 1][b].rgbtRed * (0)) + (image[a - 1][b + 1].rgbtRed * (1)))
+ ((image[a][b].rgbtRed * (0)) + (image[a][b + 1].rgbtRed * (2))));
gx[a][b].Green = (((image[a - 1][b].rgbtGreen * (0)) + (image[a - 1][b + 1].rgbtGreen * (1)))
+ ((image[a][b].rgbtGreen * (0)) + (image[a][b + 1].rgbtGreen * (2))));
gx[a][b].Blue = (((image[a - 1][b].rgbtBlue * (0)) + (image[a - 1][b + 1].rgbtBlue * (1)))
+ ((image[a][b].rgbtBlue * (0)) + (image[a][b + 1].rgbtBlue * (2))));
gy[a][b].Red = (((image[a - 1][b].rgbtRed * (-2)) + (image[a - 1][b + 1].rgbtRed * (-1)))
+ ((image[a][b].rgbtRed * (0)) + (image[a][b + 1].rgbtRed * (0))));
gy[a][b].Green = (((image[a - 1][b].rgbtGreen * (-2)) + (image[a - 1][b + 1].rgbtGreen * (-1)))
+ ((image[a][b].rgbtGreen * (0)) + (image[a][b + 1].rgbtGreen * (0))));
gy[a][b].Blue = (((image[a - 1][b].rgbtBlue * (-2)) + (image[a - 1][b + 1].rgbtBlue * (-1)))
+ ((image[a][b].rgbtBlue * (0)) + (image[a][b + 1].rgbtBlue * (0))));
}
//bottom right corner
else if (b == (width - 1))
{
gx[a][b].Red = (((image[a - 1][b - 1].rgbtRed * (-1)) + (image[a - 1][b].rgbtRed * (0)))
+ ((image[a][b - 1].rgbtRed * (-2)) + (image[a][b].rgbtRed * (0))));
gx[a][b].Green = (((image[a - 1][b - 1].rgbtGreen * (-1)) + (image[a - 1][b].rgbtGreen * (0)))
+ ((image[a][b - 1].rgbtGreen * (-2)) + (image[a][b].rgbtGreen * (0))));
gx[a][b].Blue = (((image[a - 1][b - 1].rgbtBlue * (-1)) + (image[a - 1][b].rgbtBlue * (0)))
+ ((image[a][b - 1].rgbtBlue * (-2)) + (image[a][b].rgbtBlue * (0))));
gy[a][b].Red = (((image[a - 1][b - 1].rgbtRed * (-1)) + (image[a - 1][b].rgbtRed * (-2)))
+ ((image[a][b - 1].rgbtRed * (0)) + (image[a][b].rgbtRed * (0))));
gy[a][b].Green = (((image[a - 1][b - 1].rgbtGreen * (-1)) + (image[a - 1][b].rgbtGreen * (-2)))
+ ((image[a][b - 1].rgbtGreen * (0)) + (image[a][b].rgbtGreen * (0))));
gy[a][b].Blue = (((image[a - 1][b - 1].rgbtBlue * (-1)) + (image[a - 1][b].rgbtBlue * (-2)))
+ ((image[a][b - 1].rgbtBlue * (0)) + (image[a][b].rgbtBlue * (0))));
}
//rest of the bottom row
else
{
gx[a][b].Red = (((image[a - 1][b - 1].rgbtRed * (-1)) + (image[a - 1][b].rgbtRed * (0)) + (image[a - 1][b + 1].rgbtRed * (1)))
+ ((image[a][b - 1].rgbtRed * (-2)) + (image[a][b].rgbtRed * (0)) + (image[a][b + 1].rgbtRed * (2))));
gx[a][b].Green = (((image[a - 1][b - 1].rgbtGreen * (-1)) + (image[a - 1][b].rgbtGreen * (0)) + (image[a - 1][b + 1].rgbtGreen * (1)))
+ ((image[a][b - 1].rgbtGreen * (-2)) + (image[a][b].rgbtGreen * (0)) + (image[a][b + 1].rgbtGreen * (2))));
gx[a][b].Blue = (((image[a - 1][b - 1].rgbtBlue * (-1)) + (image[a - 1][b].rgbtBlue * (0)) + (image[a - 1][b + 1].rgbtBlue * (1)))
+ ((image[a][b - 1].rgbtBlue * (-2)) + (image[a][b].rgbtBlue * (0)) + (image[a][b + 1].rgbtBlue * (2))));
gy[a][b].Red = (((image[a - 1][b - 1].rgbtRed * (-1)) + (image[a - 1][b].rgbtRed * (-2)) + (image[a - 1][b + 1].rgbtRed * (-1)))
+ ((image[a][b - 1].rgbtRed * (0)) + (image[a][b].rgbtRed * (0)) + (image[a][b + 1].rgbtRed * (0))));
gy[a][b].Green = (((image[a - 1][b - 1].rgbtGreen * (-1)) + (image[a - 1][b].rgbtGreen * (-2)) + (image[a - 1][b + 1].rgbtGreen * (-1)))
+ ((image[a][b - 1].rgbtGreen * (0)) + (image[a][b].rgbtGreen * (0)) + (image[a][b + 1].rgbtGreen * (0))));
gy[a][b].Blue = (((image[a - 1][b - 1].rgbtBlue * (-1)) + (image[a - 1][b].rgbtBlue * (-2)) + (image[a - 1][b + 1].rgbtBlue * (-1)))
+ ((image[a][b - 1].rgbtBlue * (0)) + (image[a][b].rgbtBlue * (0)) + (image[a][b + 1].rgbtBlue * (0))));
}
}
//middle rows
else
{
//left column (except the corners)
if (b == 0)
{
gx[a][b].Red = (((image[a - 1][b].rgbtRed * (0)) + (image[a - 1][b + 1].rgbtRed * (1)))
+ ((image[a][b].rgbtRed * (0)) + (image[a][b + 1].rgbtRed * (2)))
+ ((image[a + 1][b].rgbtRed * (0)) + (image[a + 1][b + 1].rgbtRed * (1))));
gx[a][b].Green = (((image[a - 1][b].rgbtGreen * (0)) + (image[a - 1][b + 1].rgbtGreen * (1)))
+ ((image[a][b].rgbtGreen * (0)) + (image[a][b + 1].rgbtGreen * (2)))
+ ((image[a + 1][b].rgbtGreen * (0)) + (image[a + 1][b + 1].rgbtGreen * (1))));
gx[a][b].Blue = (((image[a - 1][b].rgbtBlue * (0)) + (image[a - 1][b + 1].rgbtBlue * (1)))
+ ((image[a][b].rgbtBlue * (0)) + (image[a][b + 1].rgbtBlue * (2)))
+ ((image[a + 1][b].rgbtBlue * (0)) + (image[a + 1][b + 1].rgbtBlue * (1))));
gy[a][b].Red = (((image[a - 1][b].rgbtRed * (-2)) + (image[a - 1][b + 1].rgbtRed * (-1)))
+ ((image[a][b].rgbtRed * (0)) + (image[a][b + 1].rgbtRed * (0)))
+ ((image[a + 1][b].rgbtRed * (2)) + (image[a + 1][b + 1].rgbtRed * (1))));
gy[a][b].Green = (((image[a - 1][b].rgbtGreen * (-2)) + (image[a - 1][b + 1].rgbtGreen * (-1)))
+ ((image[a][b].rgbtGreen * (0)) + (image[a][b + 1].rgbtGreen * (0)))
+ ((image[a + 1][b].rgbtGreen * (2)) + (image[a + 1][b + 1].rgbtGreen * (1))));
gy[a][b].Blue = (((image[a - 1][b].rgbtBlue * (-2)) + (image[a - 1][b + 1].rgbtBlue * (-1)))
+ ((image[a][b].rgbtBlue * (0)) + (image[a][b + 1].rgbtBlue * (0)))
+ ((image[a + 1][b].rgbtBlue * (2)) + (image[a + 1][b + 1].rgbtBlue * (1))));
}
//rightmost column (except corners)
else if (b == (width - 1))
{
gx[a][b].Red = (((image[a - 1][b - 1].rgbtRed * (-1)) + (image[a - 1][b].rgbtRed * (0)))
+ ((image[a][b - 1].rgbtRed * (-2)) + (image[a][b].rgbtRed * (0)))
+ ((image[a + 1][b - 1].rgbtRed * (-1)) + (image[a + 1][b].rgbtRed * (0))));
gx[a][b].Green = (((image[a - 1][b - 1].rgbtGreen * (-1)) + (image[a - 1][b].rgbtGreen * (0)))
+ ((image[a][b - 1].rgbtGreen * (-2)) + (image[a][b].rgbtGreen * (0)))
+ ((image[a + 1][b - 1].rgbtGreen * (-1)) + (image[a + 1][b].rgbtGreen * (0))));
gx[a][b].Blue = (((image[a - 1][b - 1].rgbtBlue * (-1)) + (image[a - 1][b].rgbtBlue * (0)))
+ ((image[a][b - 1].rgbtBlue * (-2)) + (image[a][b].rgbtBlue * (0)))
+ ((image[a + 1][b - 1].rgbtBlue * (-1)) + (image[a + 1][b].rgbtBlue * (0))));
gy[a][b].Red = (((image[a - 1][b - 1].rgbtRed * (-1)) + (image[a - 1][b].rgbtRed * (-2)))
+ ((image[a][b - 1].rgbtRed * (0)) + (image[a][b].rgbtRed * (0)))
+ ((image[a + 1][b - 1].rgbtRed * (1)) + (image[a + 1][b].rgbtRed * (2))));
gy[a][b].Green = (((image[a - 1][b - 1].rgbtGreen * (-1)) + (image[a - 1][b].rgbtGreen * (-2)))
+ ((image[a][b - 1].rgbtGreen * (0)) + (image[a][b].rgbtGreen * (0)))
+ ((image[a + 1][b - 1].rgbtGreen * (1)) + (image[a + 1][b].rgbtGreen * (2))));
gy[a][b].Blue = (((image[a - 1][b - 1].rgbtBlue * (-1)) + (image[a - 1][b].rgbtBlue * (-2)))
+ ((image[a][b - 1].rgbtBlue * (0)) + (image[a][b].rgbtBlue * (0)))
+ ((image[a + 1][b - 1].rgbtBlue * (1)) + (image[a + 1][b].rgbtBlue * (2))));
}
//everything in middle
else
{
gx[a][b].Red = (((image[a - 1][b - 1].rgbtRed * (-1)) + (image[a - 1][b].rgbtRed * (0)) + (image[a - 1][b + 1].rgbtRed * (1)))
+ ((image[a][b - 1].rgbtRed * (-2)) + (image[a][b].rgbtRed * (0)) + (image[a][b + 1].rgbtRed * (2)))
+ ((image[a + 1][b - 1].rgbtRed * (-1)) + (image[a + 1][b].rgbtRed * (0)) + (image[a + 1][b + 1].rgbtRed * (1))));
gx[a][b].Green = (((image[a - 1][b - 1].rgbtGreen * (-1)) + (image[a - 1][b].rgbtGreen * (0)) + (image[a - 1][b + 1].rgbtGreen * (1)))
+ ((image[a][b - 1].rgbtGreen * (-2)) + (image[a][b].rgbtGreen * (0)) + (image[a][b + 1].rgbtGreen * (2)))
+ ((image[a + 1][b - 1].rgbtGreen * (-1)) + (image[a + 1][b].rgbtGreen * (0)) + (image[a + 1][b + 1].rgbtGreen * (1))));
gx[a][b].Blue = (((image[a - 1][b - 1].rgbtBlue * (-1)) + (image[a - 1][b].rgbtBlue * (0)) + (image[a - 1][b + 1].rgbtBlue * (1)))
+ ((image[a][b - 1].rgbtBlue * (-2)) + (image[a][b].rgbtBlue * (0)) + (image[a][b + 1].rgbtBlue * (2)))
+ ((image[a + 1][b - 1].rgbtBlue * (-1)) + (image[a + 1][b].rgbtBlue * (0)) + (image[a + 1][b + 1].rgbtBlue * (1))));
gy[a][b].Red = (((image[a - 1][b - 1].rgbtRed * (-1)) + (image[a - 1][b].rgbtRed * (-2)) + (image[a - 1][b + 1].rgbtRed * (-1)))
+ ((image[a][b - 1].rgbtRed * (0)) + (image[a][b].rgbtRed * (0)) + (image[a][b + 1].rgbtRed * (0)))
+ ((image[a + 1][b - 1].rgbtRed * (1)) + (image[a + 1][b].rgbtRed * (2)) + (image[a + 1][b + 1].rgbtRed * (1))));
gy[a][b].Green = (((image[a - 1][b - 1].rgbtGreen * (-1)) + (image[a - 1][b].rgbtGreen * (-2)) + (image[a - 1][b + 1].rgbtGreen * (-1)))
+ ((image[a][b - 1].rgbtGreen * (0)) + (image[a][b].rgbtGreen * (0)) + (image[a][b + 1].rgbtGreen * (0)))
+ ((image[a + 1][b - 1].rgbtGreen * (1)) + (image[a + 1][b].rgbtGreen * (2)) + (image[a + 1][b + 1].rgbtGreen * (1))));
gy[a][b].Blue = (((image[a - 1][b - 1].rgbtBlue * (-1)) + (image[a - 1][b].rgbtBlue * (-2)) + (image[a - 1][b + 1].rgbtBlue * (-1)))
+ ((image[a][b - 1].rgbtBlue * (0)) + (image[a][b].rgbtBlue * (0)) + (image[a][b + 1].rgbtBlue * (0)))
+ ((image[a + 1][b - 1].rgbtBlue * (1)) + (image[a + 1][b].rgbtBlue * (2)) + (image[a + 1][b + 1].rgbtBlue * (1))));
}
}
}
}
//loop to get values of edge
for (int c = 0; c < height; c++)
{
for (int d = 0; d < width; d++)
{
edge[c][d].Red = round(sqrtf ((gx[c][d].Red * gx[c][d].Red) + (gy[c][d].Red * gy[c][d].Red)));
edge[c][d].Green = round(sqrtf ((gx[c][d].Green * gx[c][d].Green) + (gy[c][d].Green * gy[c][d].Green)));
edge[c][d].Blue = round(sqrtf ((gx[c][d].Blue * gx[c][d].Blue) + (gy[c][d].Blue * gy[c][d].Blue)));
//capping values at 255
if (edge[c][d].Red > 255)
edge[c][d].Red = 255;
if (edge[c][d].Green > 255)
edge[c][d].Green = 255;
if (edge[c][d].Blue > 255)
edge[c][d].Blue = 255;
}
}
//loop to copy new values
for (int e = 0; e < height; e++)
{
for (int f = 0; f < width; f++)
{
image[e][f].rgbtRed = edge[e][f].Red;
image[e][f].rgbtGreen = edge[e][f].Green;
image[e][f].rgbtBlue = edge[e][f].Blue;
}
}
return;
}```
it might be a bit overcomplicated.