Dywan Sierpińskiego NCURSES

Dywan Sierpińskiego NCURSES
antoniaklja
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

Witam mam problem z napisaniem programu rysującego dywan sierpińskiego.
Przy kompilacji wyskakuje:

Kopiuj
 zad2.c: In function ‘main’:
zad2.c:57: error: too few arguments to function ‘screen_init’

Kod źródłowy:

Kopiuj
#include <stdio.h>
#include <stdlib.h>
#include <ncurses.h>
#include <time.h>

/* WINDOW *newwin(nlines, ncols, begy, begx)   */

int current_getch;
int doloop = 1;
static WINDOW *mainwindow;
WINDOW *screen;

void init(void)
 {
    mainwindow = initscr();
    noecho();
    cbreak;
    nodelay(screen, TRUE);
    wrefresh(screen);
 }


void screen_init(int x, int y, int width, int height)
 {
    int x2, y2;


    x2 = x * 3 / width;
    y2 = y * 3 / height;

    x -= (x2 * width+2)  / 3;
    y -= (y2 * height+2) / 3;
    width  = (width +2-x2)/3;
    height = (height+2-y2)/3;

    screen = newwin( width, height, y, x);

    box(screen, ACS_VLINE, ACS_HLINE);
    curs_set(0);
    wrefresh(screen);
    refresh();

 return screen_init(x, y, width, height);
 }

void screen_end(void)
 {
    endwin();
 }


int main()
 {
  screen_init();
  while(doloop)
   {
      current_getch = getch();
      if(current_getch == 113) doloop = 0; // wcisniecie q powoduje zakonczenie programu
      init();
      screen_init(0, 0, 50, 100);
      sleep(1);




    }
   screen_end();

  return 0;
 }

 
złoty
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 109
1

na początku funkcji main masz wywołanie funkcji screen_init(), która przyjmuje 4 argumenty, ty nie podałeś żadnego, może chodziło Ci o funkcję init()?

antoniaklja
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

Dzięki, nie zauważyłem ten funkcji na początku.
Niestety dalej mam problem z narysowaniem go.
Dostaje komunikat o naruszeniu ochrony pamięci.
Kwadraty się rysują ale nie w odpowiednich miejscach.

Kod źródłowy:

Kopiuj
#include <stdio.h>
#include <stdlib.h>
#include <ncurses.h>
#include <time.h>

/* WINDOW *newwin(nlines, ncols, begy, begx)   */

int current_getch;
int doloop = 1;
static WINDOW *mainwindow;
WINDOW *screen;

void init(void)
 {
    mainwindow = initscr();
    noecho();
    cbreak;
    nodelay(screen, TRUE);
    wrefresh(screen);
 }


int screen_init(int x, int y, int width, int height)
 {
    int x2, y2, i;

    for(i=0; i<2; i++)
     {
      x2 = x * 3 / width;
      y2 = y * 3 / height;

      if (x2 == 1 && y2 == 1) //  czyszczenie srodka kwadratu
         return 0;


      x -= (x2 * width+2)  / 3;
      y -= (y2 * height+2) / 3;
      width  = (width +2-x2)/3;
      height = (height+2-y2)/3;

      screen = newwin( width, height, y, x);

      box(screen, ACS_VLINE, ACS_HLINE);
      curs_set(0);
      wrefresh(screen);
//      refresh();

      return screen_init(x, y, width, height);
    }

 }

void screen_end(void)
 {
    endwin();
 }


int main()
 {
  init();
  screen_init(30, 30, 50, 100);
  while(doloop)
    {
       current_getch = getch();
       if(current_getch == 113) doloop = 0;
    }

  screen_end();
  return 0;
 }

 
lukasz1235
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1105
0

Wygląda mi to na nieskończoną rekurencję.

Powinno być raczej tak:

Kopiuj
      if (x2 < 1 && y2 < 1) //  czyszczenie srodka kwadratu
         return 0;
Xitami
  • Rejestracja: dni
  • Ostatnio: dni
0

a przede wszystkim, pisze się Sierpińskiego
rozumiem, że doda można pisać z wielkiej litery, ale nie na 4p

antoniaklja
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 88
0

niestety po poprawieniu tego warunku nie wyswietla się nawet jeden kwadracik..

lukasz1235
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1105
0

Odkomentuj refresh()

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.