Kompilator pokazuje błąd (C++)


(Igorbugajski2) #1

Witam.

Wiem, że tytuł trochę noobski, ale nie wiedziałem, jak to sformułować.

 

Otóż robię pewną prostą gierkę konsolową, ale nie o to chodzi.

W funkcji odpowiadającej za atak pięścią wszystko wygląda OK, mimo to kompilator podaje jakiś dzwiny błąd.

To jest kod:

bool atak_piesc(int atakujacy, int sila_w, int zrecznosc_w, int inteligencja_w, int spostrzegawczosc_w, bool bron_w)
{
    double powodzenie = (rand()%3)+1;
    double unik;
    double blok;

    if(atakujacy<=0)
    {
        unik = (spostrzegawczosc_w*(0.5*inteligencja_w))*0.5;
        blok = (spostrzegawczosc_w*(0.5*zrecznosc_w))*0.5;
        unik = ceil(unik);
        blok = ceil(blok);
        powodzenie = powodzenie+(sila+1)-sila_w;
        if(unik>blok) powodzenie = powodzenie-(0.5*unik);
        if(blok>unik) powodzenie = powodzenie-(0.5*blok);
        if(bron_w==true) powodzenie = powodzenie*0.1;
        if(powodzenie>5) return true;
        else return false;
    }
    else
    {
        unik = (spostrzegawczosc*(0.5*inteligencja))*0.5;
        blok = (spostrzegawczosc*(0.5*zrecznosc))*0.5;
        unik = ceil();
        blok = ceil();
        powodzenie = powodzenie+(sila_w+1)-sila;
        if(unik>blok) powodzenie = powodzenie-(0.5*unik);
        if(blok>unik) powodzenie = powodzenie-(0.5*blok);
        if(bron==true) powodzenie = powodzenie*0.1;
        if(powodzenie>5) return true;
        else return false;
    }
}

Kompliator pokazuje mi przy linii 670 błąd "a function-definition is not allowed here before '{' token", a ja niezbyt rozumiem, o co chodzi. (w sensie logicznym, nie językowym)

 

Oprócz tego przy funkcji odpowiadającej za atak bronią, mianowicie:

bool atak_bron(int atakujacy, int sila_w, int zrecznosc_w, int inteligencja_w, int spostrzegawczosc_w, bool bron_w)
{
    double powodzenie = (rand()%4)+1;
    double unik;
    double blok;

    if(atakujacy<=0)
    {
        unik = (spostrzegawczosc_w*(0.3*inteligencja_w))*0.3;
        if(bron_w=true) blok = (spostrzegawczosc_w*(0.7*zrecznosc_w))*0.7;
        else blok = 0;
        unik = floor(unik);
        blok = ceil(blok);
        powodzenie = powodzenie+sila+zrecznosc-sila_w-zrecznosc_w+1;
        if(unik>blok) powodzenie = powodzenie-(0.5*unik);
        if(blok>unik) powodzenie = powodzenie-(0.5*blok);
    }
    else
    {
        unik = (spostrzegawczosc*(0.3*inteligencja))*0.3;
        if(bron=true) blok = (spostrzegawczosc*(0.7*zrecznosc))*0.7;
        else blok = 0;
        unik = floor(unik);
        blok = ceil(blok);
        powodzenie = powodzenie+sila_w+zrecznosc_w-sila-zrecznosc+1;
        if(unik>blok) powodzenie = powodzenie-(0.5*unik);
        if(blok>unik) powodzenie = powodzenie-(0.5*blok);
    }
    if(powodzenie>5) return true;
    else return false;
}

Kompilator pokazuje w linii 733 błąd "excepted '}' at end of input".

 

Korzystam ze środowiska CodeBlocks, a więc kompilator MinGW.


#2

 

Zapewne wcześniejszej funkcji nie zamknąłeś  znakiem ‘}’ więc musisz prześledzić wcześniejszy kod, przed linią 669. Najeżdżaj na znaki ‘}’ i patrz który znak ci ‘{’ ci kodeblocks podświetli.

Błąd występuje gdy deklarujesz funkcje w funkcji np.

int zwruc(){
int funkcja_wewnetrzna(){
return 1;
}
return 2;
}

Jak naprawisz poprzedni błąd to ten też się rozwiąże. Masz po prostu nie równą liczbę znaków ‘{’ i ‘’}’. Każdemu znakowi ‘{’ musi odpowiadać ‘}’.

 

Linia 712 i 723 zamiast if(bron=true) powinno być if(bron==true). Dwa znaki równości zamiast jednego. Jęśli chcesz tego typu błędów uniknąć to możesz pisać najpierw stałą później zmienną.

 

 if(true=bron)  //się nie skompiluje wyrzucając błąd.

 if(true==bron)  //się nie skompiluje i będzie działać tak jak chciałeś.


(Igorbugajski2) #3

Faktycznie, poprzednia funkcja była niezamknięta, pogubiłem się trochę w tym wszystkim po prostu (tak, nie umiem estetycznie pisać xD).

Co do operatorów “==”, to po prostu nie zauważyłem tego. :stuck_out_tongue:

W każdym razie teraz działa, dzięki. :slight_smile:

Przy okazji jeszcze w jednym miejscu źle użyłem funkcji ceil, też to naprawiłem. :wink:


#4

W code::blocks 13.12 masz formatowanie do wcięć. Menu->pligins->source code formatter (A style). Można tam go dowolnie skonfigurować. We wcześnejszych wersjac C:B też był, ale chyba pod inną nazwą. Więc estetycznym pisaniem nie musisz się martwić.