[C] nCurses "Naruszenie ochrony pamięci"

0

W trakcie kompilacji owego programu:

#include <curses.h>


int current_getch;
int powtarzaj = 1;
int szer,wys,pol_y,pol_x,ramka;
char *tytul;
static WINDOW *mainwnd,*okienko;
   

void screen_init(int wys,int szer,int pol_y,int pol_x,int ramka,char *tytul)
{ 
  mainwnd = initscr();
  noecho();
  cbreak();
  nodelay(mainwnd, TRUE);
  curs_set(0); 
  wrefresh(mainwnd);
  okienko = newwin(wys, szer, pol_y, pol_x);
  mvwprintw(okienko,2,1,"WYS: %d",wys);
  mvwprintw(okienko,3,1,"SZER: %d",szer);
  mvwprintw(okienko,4,1,"Y: %d",pol_y);
  mvwprintw(okienko,5,1,"X: %d",pol_x);
  if (ramka==1)
  {
  mvwprintw(okienko,6,1,"RAMKA: %s","jest");
  box(okienko, ACS_VLINE, ACS_HLINE);
  }else{
  mvwprintw(okienko,6,1,"RAMKA: %s","brak");
  }
  mvwprintw(okienko,0,0,"%s",tytul);
  mvwprintw(okienko,1,1,"%s","(ESC-WY)");
  refresh();
  wrefresh(okienko);
}


void screen_end(void)
{
  endwin();
}


int main(int argc, char *argv[])
{
  wys=atoi(argv[1]);
  szer=atoi(argv[2]);
  pol_y=atoi(argv[3]);
  pol_x=atoi(argv[4]);
  ramka=atoi(argv[5]);
  tytul=argv[6];
  screen_init(wys,szer,pol_y,pol_x,ramka,tytul);
  while (powtarzaj)
  {
    current_getch = getch();
    if (current_getch == 27) powtarzaj = 0;
  }
  screen_end();
  return 0;
}
   

wyskakuje mi błąd "Naruszenie ochrony pamięci" i nie wiem dlaczego..

Używam gcc na systemie Ubuntu 8.10, biblioteki ncurses także mam zainstalowane..

Pozdrawiam InsicT :)

0

W trakcie kompilacji owego programu: [...] wyskakuje mi błąd "Naruszenie ochrony pamięci" i nie wiem dlaczego..

jak to w trakcie kompilacji?
i podaj jeszcze jak wywołujesz program <mysli>
może cos pomieszałeś przy argumentach wywołania <mysli>

0
piograb napisał(a)

W trakcie kompilacji owego programu: [...] wyskakuje mi błąd "Naruszenie ochrony pamięci" i nie wiem dlaczego..

jak to w trakcie kompilacji?
i podaj jeszcze jak wywołujesz program <mysli>
może cos pomieszałeś przy argumentach wywołania <mysli>

..pomyliłem sie, nie w trakcie kompilacji, tylko podczas uruchomienia (./zad1) dostaje Segmentation fault.
Kompiluje takim poleceniem: gcc zad1.c -o zad1 -lncurses -Wall i nie dostaje żadnego warrninga.

0

podczas uruchomienia (./zad1)

jeżeli uruchamiasz przez samo
./zad1
to nie dziwo, że Ci wywala segmentation fault skoro nie podajesz zadnych wartości inicjujących zmienne globalne z początku programu.
Spróbuj uruchomić tak:
./zad1 30 30 10 10 1 napis_tytulu

w ogole wiesz co znaczy "argv[1]" itp? <mysli>

edit:
u mnie ruszyło... musiałem tytlko dodać #include <stdlib.h> żeby mi atoi działało <mysli>

0

działa ! :)

0

Szukalem ale nic nie znalazłem na temat tej funkcji.. jeśli mozesz.. ?

to nie jest funkcja tylko tablica argumentów wywołania programu...
funkcja int main(); może przyjmować argument void, albo dwa argumenty (int argc, char ** argv). Gdzie:
argc - licznik argumentów wywołania (wiekszy bądź równy 1)
argv - tablica stringów o ilości wartości równej argc
W praktyce jeżeli w programie napiszesz funkcje int main(int argc, char **argv); i wywołasz program bez argumentów czyli ( ./program ) to argc bedzie wynosic 1, a argv[0] bedzie przechowywać nazwe programu.
Jeżeli podasz jeden argument (uruchomisz program przez: ./program argument_1) to argc wynosic bedzie 2. Tablica argv powiekszy sie do 2 elementów: argv[0] - nazwa programu, argv[1] bedzie przechowywac ciąg "argument_1".
Wiec wywołując program z n elementami ( ./program el_1 el_2 ... el_n ) argc bedzie wynosic n+1 (n elementów + nazwa programu) a tablica argv[] bedzie przechowywać n+1 łańcuchów ( argv[0] - nazwa programu, argv[1] ... argv[n-1] - kolejne parametry wywołania)

Każdy parametr który przekazujesz przy wywołaniu jest ciągiem znaków więc jeżeli przekazujesz do programu liczbe ( np. 100 ) to tak naprawde przekazujesz napis "100" i dlatego na początku main'a masz przypisanie wartości przez funkcje atoi(); która konwertuje liczby zawarte w łańcuchu na int'y.

W programie, który wkleiłeś nie ma nigdzie inicjowania zmiennych wartosciami więc do tworzenia okna w ncurses wykorzystywane sa liczby, które akurat znajdowały się w obszarze pamięci zaalokowanym dla zmiennych podczas ich deklaracji na początku programu. Gdybys w programie wpisal instrukcje, które mialy by przypisać do zmiennych jakies wartosci (czy losowe czy wprowadzane z klawiatury czy z pliku) to nie musialbys wywolywac programu z argumentami.

Wygoogluj jakieś informacje o argumentach wywołania programu w C i poczytaj <mysli>

[nie myśl tyle;) - R]

0
piograb napisał(a)

funkcja int main(); może przyjmować argument void, albo dwa argumenty (int argc, char ** argv). Gdzie:
argc - licznik argumentów wywołania (wiekszy bądź równy 1)
argv - tablica stringów o ilości wartości równej argc

I jest jeszcze trzeci argument

int main( int argc, char* argv[], char* env[] )

I wtedy env zawiera zmienne środowiskowe.

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