2013-11-22 4 views
0

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

#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

Довольно пожалуйста с клубникой и вишней сверху, используйте правильный отступ при отправке кода! – Angew

+0

И можете ли вы, пожалуйста, изменить это на минимальный образец, a.k.a. [SSCCE] (http://sscce.org/)? Или, по крайней мере, сообщите нам *, который * NewImage сообщает об ошибке. – Angew

ответ

5

Заменить этот

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

с этим

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

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