Ошибка отладки C ++

0

Когда я запускаю следующую программу, которую я написал, я получаю ошибку проверки выполнения во время выполнения # 2-. Стек переменной NewImage был поврежден. Как я могу это исправить? Я знаю, что это связано с переходом границы памяти переменных, но я не уверен, что изменить. Благодарю!

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

const int ROWS = 16;
const int COLS = 16;

enum flipType {HORIZONTAL, VERTICAL};
enum rotateType {CLOCKWISE, COUNTER_CLOCKWISE};
void getImage(char img[][COLS]);
void print(const char img[][COLS], string msg);
void flip(const char img[][COLS], char NewImage[][COLS], flipType);
void negative(const char img[][COLS], char NewImage[][COLS]);
void rotate(const char img[][COLS], char NewImage[][COLS], rotateType);

int main()
{
    char Image[ROWS][COLS];
    char NewImage[ROWS][COLS];
    getImage(Image);
    // print the original image
    print(Image, "Original Image");
    getImage(NewImage);
    flip(Image, NewImage, VERTICAL);
    print(NewImage, "Vertically Flipped Image");
    getImage(Image);
    flip(Image, NewImage, HORIZONTAL);
    print(NewImage, "Horizontally Flipped Image");
    getImage(Image);
    negative(Image, NewImage);
    print(NewImage, "Negative Image");
    getImage(Image);
    rotate(Image, NewImage, CLOCKWISE);
    print(NewImage, "Clockwise Rotated Image");
    getImage(Image);
    rotate(Image, NewImage, COUNTER_CLOCKWISE);
    print(NewImage, "Counter-Clockwise Rotated Image");
    return 0;
}
void getImage(char img[][COLS])
{
    char discard;
    //Load image from file
    ifstream imgFile;
    imgFile.open("16X16L.txt");
    for (int i=0; i<ROWS; i++)
    {
        for (int j=0; j<COLS; j++)
        {
            char inputChar;
            imgFile.get(inputChar);
            // Convert digital to blank or asterisk
            if (inputChar == '0')
                img[i][j] = ' ';
            else
                img[i][j] = '*';
        }
        // throw away the newline character
        imgFile.get(discard);
    }
}
void print(const char img[][COLS], string msg)
{
    cout << msg << endl;
    for (int i=0; i < ROWS; i++)
    {
        for (int j=0; j < COLS; j++)
        {
            cout << img[i][j];
        }
        cout << endl;
    }
}

void flip(const char img[][COLS], char NewImage[][COLS], flipType flipDir)
{
    if(flipDir == HORIZONTAL)
    {
        for (int i=0; i<ROWS; i++)
        {
            for (int j=0; j<COLS; j++)
            {
                NewImage[i][-j-1]= img[i][j];
            }
        }
    }
    else if (flipDir == VERTICAL)
    {
        for (int i=0; i<COLS; i++)
        {
            for (int j=0; j<ROWS; j++)
            {
                NewImage[ROWS-1-i][j]= img[i][j];
            }
        }

    }
}

void negative(const char img[][COLS], char NewImage[][COLS])
{
    for (int i=0; i<ROWS; i++)
    {
        for (int j=0; j<COLS; j++)
        {
            if (img[i][j] == ' ')
                NewImage[i][j] = '*';
            else NewImage[i][j] = ' ';
        }
    }
}

void rotate(const char img[][COLS], char NewImage[][COLS], rotateType rotateDir)
{
    if (rotateDir == CLOCKWISE)
    {
        for(int i=0; i<COLS; i++)
        {
            for(int j=0; j<ROWS; j++)
            {
                NewImage[i][j] = img[ROWS-1-j][i];
            }
        }
    }
    else
    {
        for(int i=0; i<COLS; i++)
        {
            for(int j=0; j<ROWS; j++)
            {
                NewImage[i][j] = img[j][COLS-1-i];
            }
        }
    }
}
  • 1
    Довольно, пожалуйста, с клубникой и вишней сверху, используйте правильный отступ при размещении кода!
  • 0
    И можете ли вы уменьшить это до минимального образца, иначе SSCCE ? Или, по крайней мере, сообщите нам, какой NewImage сообщает об ошибке.
Теги:

1 ответ

5
Лучший ответ

Заменить это

NewImage[i][-j-1]= img[i][j];

с этим

NewImage[i][COLS-j-1]= img[i][j];

Не знаете, почему вы не могли это понять, так как вы получили вертикальный флип, и вы хорошо понимали, в чем проблема. Мне нужно научиться внимательно смотреть на свой собственный код.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню