Segfault 11 na starcie

0

Witam. Piszę grę w życie i po paru ostatnich zmianach zaczął mi wyskakiwać segmentation faullt 11 i już naprawdę długi czas dojść nie mogę co poszło nie tak. Może mógłby mi ktoś w tym pomóc, będę bardzo wdzięczna.

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

double get_random(double min, double max)
{
 return ((double)rand()/RAND_MAX)*(max-min)+min;
}
void rysuj(int x, int y)
{
    int i, j;
    for(i = 1; i < x - 1; i++)
    {
        for(j = 1; j < y - 1; j++)
        {
            if(get_random(0.0, 1.0) <= 0.35) mvaddch(i, j, '*');
            else mvaddch(i, j, ' ');
        }
    }
    refresh();
}

void okno()
{
    noecho();
    initscr();
    start_color();
    init_pair(1, COLOR_MAGENTA, COLOR_BLUE);
    attron(COLOR_PAIR(1));
    wbkgd(stdscr, COLOR_PAIR(1));
    attron( A_BOLD );
}
char gra(int x, int y, int k, int licz)
{
    int i, j, h, a, b;
    int arr[25][80];
    char c[25][80];

    for(h = 0; h < k; h++)
    {
        for(i = 1; i < x; i++)
        {
            for(j = 1; j < y; j++)
            {
                if(c[i][j] == '*') licz--;

                for(a = i - 1; a <= i + 1; a++)
                {
                    for(b = j - 1; b <= j + 1; b++)
                    {
                        if(c[a][b] == '*') licz++;
                    }
                }
            if((licz > 3 || licz < 2) && c[i][j] == '*') arr[i][j]=1;
            else if(licz == 3 && c[i][j] == ' ') arr[i][j]=1;
            else arr[i][j]=0;

            if(c[i][j] == '*' && arr[i][j] == 1) mvaddch(i, j, ' ');
            if(c[i][j] == ' ' && arr[i][j] == 1) mvaddch(i, j, '*');

            refresh();
            sleep(1);
            }
        }
    }
}


int main()
{
    int x, y, k, licz;
    licz = 0;
    okno();
    printw("\n\t\t\t Gra w zycie\n");
    while(1)
    {

        printw("\t\tPodaj wymiary planszy gry (max 25 x 80)\n\t\t\twysokosc = ");
        scanw("%d", &x);
        if(x == false || x>25)
        {
            printw("\t\t\tWprowadzono niepoprawne dane\n");
            continue;
        }
        else break;
    }
    while(1)
    {
        printw("\t\t\t szerokosc = ");
        scanw("%d", &y);
        if(y == false || y>80)
        {
            printw("\t\t\tWprowadzono niepoprawne dane\n");
            continue;
        }
        else break;
    }
    while(1)
    {
        printw("\t Podaj ilosc krokow, po ktorych program zakonczy dzialanie : ");
        scanw("%d", &k);
        if(k == false || k<1)
        {
            printw("\t\t\tWprowadzono niepoprawne dane\n");
            continue;
        }
        else break;
    }

    getmaxyx(stdscr, LINES, COLS);
    refresh();
    wclear(stdscr);
    refresh();

    rysuj(x, y);
    gra(x, y, k, licz);

    getch();
    endwin();
    return 0;
}
0

Nie brakuje Ci przypadkiem:

srand( time( NULL ) );
0

Odpal sobie debbuger, Jak się pojawi błąd on ci pokaże stos i miejsce w którym się ten błąd pojawia.

2

o_O

    while(1)
    {

        printw("\t\tPodaj wymiary planszy gry (max 25 x 80)\n\t\t\twysokosc = ");
        scanw("%d", &x);
        if(x == false || x>25)
        {
            printw("\t\t\tWprowadzono niepoprawne dane\n");
            continue;
        }
        else break;
    }
    while(1)
    {
        printw("\t\t\t szerokosc = ");
        scanw("%d", &y);
        if(y == false || y>80)
        {
            printw("\t\t\tWprowadzono niepoprawne dane\n");
            continue;
        }
        else break;
    }
    while(1)
    {
        printw("\t Podaj ilosc krokow, po ktorych program zakonczy dzialanie : ");
        scanw("%d", &k);
        if(k == false || k<1)
        {
            printw("\t\t\tWprowadzono niepoprawne dane\n");
            continue;
        }
        else break;
    }

Teraz popatrz na ten kod i zastanów się czy nie da się zrobić jednej funkcji która ogarnia wszystkie 3 przypadki. Czy gdyby zimennych do wczytania było 50 też bys tak ten kod wesoło kopiowala?

Segafualt będzie juz tu:

                for(a = i - 1; a <= i + 1; a++)
                {
                    for(b = j - 1; b <= j + 1; b++)
                    {
                        if(c[a][b] == '*') licz++;

Bo wartość graniczna dla a to i+1 a przecież masz w tej tablicy tylko i indeksów, więc wychodzisz poza tablicę.
Analogicznie dla b masz j+1 które znów jest poza tablicą.

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