Следующий код получен из вопроса здесь . (Я знаю, что есть несколько логических проблем с кодом, но я не понимаю, как они вызывают эту проблему.)
Редактировать: Я использую CLANG на Windows, с общим предупреждением, отображаемым для компиляции.
Генерирует ошибку деления на ноль в указанной строке (первое утверждение в for l oop.), Но видимых делений нет. Может ли кто-нибудь дать некоторое представление о том, почему возникает эта ошибка?
Редактировать 2: По комментариям: изменение третьего аргумента в функции sepia
с
void sepia(int height, int width, RGBTRIPLE image[height][width])
на
void sepia(int height, int width, RGBTRIPLE image[3][4])
устраняет ошибку деления на ноль. Почему?
typedef struct {
double rgbtRed;
double rgbtGreen;
double rgbtBlue;
}RGBTRIPLE;
RGBTRIPLE image[3][4];
void sepia(int height, int width, RGBTRIPLE image[height][width])
{
double sepiaRed = 0.0;
double sepiaGreen = 0.0;
double sepiaBlue = 0.0;
// over height
for (int h = 0; h < height; h++)
{
// over width
for ( int w = 0; w < width; w++)
{
sepiaRed = .393 * image[h][w].rgbtRed + .769 * image[h][w].rgbtGreen + .189 * image[h][w].rgbtBlue;
// ^ Divide by zero occurs on this line.
sepiaGreen = .349 * image[h][w].rgbtRed + .686 * image[h][w].rgbtGreen + .168 * image[h][w].rgbtBlue;
sepiaBlue = .272 * image[h][w].rgbtRed + .534 * image[h][w].rgbtGreen + .131 * image[h][w].rgbtBlue;
// space
if (sepiaRed > 255 || sepiaGreen > 255 || sepiaBlue > 255)
{
sepiaRed = 255;
sepiaGreen = 255;
sepiaBlue = 255;
}
image[h][w].rgbtRed = (sepiaRed);
image[h][w].rgbtBlue = (sepiaBlue);
image[h][w].rgbtGreen = (sepiaGreen);
}
}
return;
}
int main()
{
sepia(3, 4, image);
return 0;
}