Разделить на ноль ошибок, где нет явного разделения в коде - PullRequest
5 голосов
/ 27 апреля 2020

Следующий код получен из вопроса здесь . (Я знаю, что есть несколько логических проблем с кодом, но я не понимаю, как они вызывают эту проблему.)

Редактировать: Я использую 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;
}

1 Ответ

3 голосов
/ 27 апреля 2020

Деление на 0 из-за индексации массива.

Либо VLA Поддержка неисправна или отсутствует.

//                         VLA prototype         v-------------v           
void sepia(int height, int width, RGBTRIPLE image[height][width]) {
        //                      v----v
        sepiaRed = .393 *  image[h][w].rgbtRed + .769 *  ...

Код может использовать подход без VLA как показано ниже,

void sepia(int height, int width, RGBTRIPLE image[3][4]) {

Поддержка VLA начинается с C99.

Начиная с C11 или более поздней, проверьте __STDC_NO_VLA__ на отсутствие поддержки.

...