Naruszenie ochrony pamieci przy przesuwaniu obiektu w oknie.

0

Nie wiem dlaczego ale gdy program wchodzi do petli while i tam wykonuje jeden z dwoch ruchow to program wywala komunikat o ochronie pamieci,mysle ze nie wychodze poza dostepne zasoby czy cos, spojrzcie na kod i jak ktos bedzie wiedzial to poprosilbym o podpowiedz dlaczego sie tak dzieje.

int main(void){
  WINDOW *my_wins[2];
  int row,col,startx,starty,height,width,paddx;
  char ch;

  initscr();
  clear();
  noecho();
  curs_set(0);
  cbreak();
  keypad(stdscr,true);
  getmaxyx(stdscr,row,col);

  if(has_colors()==FALSE){
    endwin();
    printf("Your terminal does not support color\n");
    exit(1);
  }
  start_color();
  init_pair(1,COLOR_GREEN,COLOR_WHITE);
  init_pair(2,COLOR_RED,COLOR_WHITE);
  init_pair(3,COLOR_BLUE,COLOR_WHITE);
  init_pair(4,COLOR_YELLOW,COLOR_WHITE);
  init_pair(5,COLOR_CYAN,COLOR_WHITE);
  init_pair(6,COLOR_MAGENTA,COLOR_WHITE);
  init_pair(7,COLOR_BLACK,COLOR_CYAN);

  starty=(LINES-HEIGHT)/2;
  startx=(COLS-WIDTH)/2;
  paddx=WIDTH/2-PADDLE_WIDTH/2;
  menu(row,col);
  my_wins[0]=newwin(HEIGHT,WIDTH,starty,startx);
  my_wins[1]=newwin(HEIGHT-4,WIDTH-25,starty-5,startx-20);
  refresh();
  game_win(my_wins[0],HEIGHT,paddx);
  stat_win(my_wins[1]);
  
  while((ch=getch())!=10){
    switch(ch){
    case BACKWARD:
      if(paddx>1){
      --paddx;
      game_win(my_wins,height,paddx);
      }
      break;
    case FORWARD:
      if((width-PADDLE_WIDTH)-paddx>1){
      ++paddx;
      game_win(my_wins,height,paddx);
      }
      break;
    }
  }
  endwin();
  return 0;
}

WINDOW *game_win(WINDOW *win,int y,int x){
  werase(win);
  box(win,0,0);
  wbkgd(win,COLOR_PAIR(7));
  for(int i=0;i<PADDLE_WIDTH;++i){
    mvwaddch(win,y-4,x+i,'=');
    mvwaddch(win,y-3,x+i,'=');
  }
  wrefresh(win);
}
1

I to ma być program?
Ja tutaj widzę jakiś zbitek cyferek i liczb, programem to będzie dopiero po podzieleniu na funkcje, struktury (...).

0

Nie dawalem calego kodu bo myslalem ze nie potrzebny caly jest tutaj, to znaczy nie caly, funkcja menu jest w innym pliku ale tu zupelnie nie o nia juz chodzi, struktury na razie nie sa uzywane chce dopiero potem ich uzyc.A co do debuggera to jak nim sprawdzic dlaczego oraz w ktorym miejscu wychodze ? Wiec wie ktos moze czemu crashuje kiedy przechodze co case FORWARD albo case BACKWARD ?

#include<ncurses.h>
#include<stdlib.h>

#define FORWARD 102
#define BACKWARD 98
#define PADDLE_WIDTH 6
#define HEIGHT 15
#define WIDTH 45

struct player_data{
  unsigned int x;
  unsigned int y;
  unsigned int deaths;
};
struct ball_data{
  unsigned int x;
  unsigned int y;
  bool mv_left;
  bool mv_right;
  bool mv_up;
  bool mv_down;
};
struct game_data{
  unsigned int max_field_x;
  unsigned int max_field_y;
  struct player_data *player;
  struct ball_data *ball;
};

WINDOW *game_win(WINDOW *my_wins,int starty,int startx);
int menu(int row,int col);

int main(void){
  WINDOW *my_wins[2];
  int row,col,startx,starty,height,width,paddx;
  char ch;

  initscr();
  clear();
  noecho();
  curs_set(0);
  cbreak();
  keypad(stdscr,true);
  getmaxyx(stdscr,row,col);

  if(has_colors()==FALSE){
    endwin();
    printf("Your terminal does not support color\n");
    exit(1);
  }
  start_color();
  init_pair(1,COLOR_GREEN,COLOR_WHITE);
  init_pair(2,COLOR_RED,COLOR_WHITE);
  init_pair(3,COLOR_BLUE,COLOR_WHITE);
  init_pair(4,COLOR_YELLOW,COLOR_WHITE);
  init_pair(5,COLOR_CYAN,COLOR_WHITE);
  init_pair(6,COLOR_MAGENTA,COLOR_WHITE);
  init_pair(7,COLOR_BLACK,COLOR_CYAN);

  starty=(LINES-HEIGHT)/2;
  startx=(COLS-WIDTH)/2;
  paddx=WIDTH/2-PADDLE_WIDTH/2;
  menu(row,col);
  my_wins[0]=newwin(HEIGHT,WIDTH,starty,startx);
  my_wins[1]=newwin(HEIGHT-4,WIDTH-25,starty-5,startx-20);
  attron(COLOR_PAIR(1));
  mvprintw(starty-7,startx+WIDTH/2-5,"PONG GAME");
  attroff(COLOR_PAIR(1));
  refresh();
  game_win(my_wins[0],HEIGHT,paddx);
  stat_win(my_wins[1]);
  
  while((ch=getch())!=10){
    switch(ch){
    case BACKWARD:
      if(paddx>1){
      --paddx;
      game_win(my_wins,height,paddx);
      }
      break;
    case FORWARD:
      if((width-PADDLE_WIDTH)-paddx>1){
      ++paddx;
      game_win(my_wins,height,paddx);
      }
      break;
    }
  }
  endwin();
  return 0;
}

WINDOW *game_win(WINDOW *win,int y,int x){
  werase(win);
  box(win,0,0);
  wbkgd(win,COLOR_PAIR(7));
  for(int i=0;i<PADDLE_WIDTH;++i){
    mvwaddch(win,y-4,x+i,'=');
    mvwaddch(win,y-3,x+i,'=');
  }
  wrefresh(win);
}
WINDOW *stat_win(WINDOW *win){
  werase(win);
  box(win,0,0);
  wrefresh(win);
}
0

A co mówi debugger?
Nie mówiąc o tym, że tutaj game_win(my_wins,height,paddx); przekazujesz tablicę, podczas gdy funkcja oczekuje pojedynczego wskaźnika.

0

Tak wiem wiem, mialem troche problemow z ustawieniem interfejsu dla debuggera i ogarnieciem paru rzeczy bo jestem bardzo zielony w sprawach debuggera ale wlasnie tez wlaczylem i powiedzial mi to i poprawilem, tam chyba jeszcze zly rozmiar liter jest jak dalem rozmiar okna w makrze, ale faktycznie, trzeba wiecej debuggera uzywac ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1