nieuzasadniony error o braku deklaracji zmiennych i enumów w funkcji

Odpowiedz Nowy wątek
2011-08-18 21:34
von_ilnicki
0

wiecie z jakiego powodu kompilator może zgłaszać errory o braku deklaracji dla zmiennych i enumów w funkcji, skoro deklaracje są (w main) i przed wywołaniem funkcji? jak ten error naprawić?

edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

2011-08-18 21:37
2

POKAŻ KOD

Pozostało 580 znaków

2011-08-18 21:41
0

wiecie z jakiego powodu kompilator może zgłaszać errory o braku deklaracji dla zmiennych i enumów w funkcji, skoro deklaracje są (w main) i przed wywołaniem funkcji? jak ten error naprawić?

Czytając ten fragment, nawet bez kodu powiem ci tak: powodem jest brak deklaracji zmiennych i enumów!
Załóż, że kompilator jest mądrzejszy od ciebie, i rzucany błąd nie jest nieuzasadniony. Zastanów się nad tym.

Poza tym, zmienne zadeklarowane w main nie są w magiczny sposób zadeklarowane na zawsze i wszędzie w każdym miejscu programu. Musisz je przekazać do funkcji.

Pozostało 580 znaków

2011-08-18 21:45
von_ilnicki
0
int KolejnyAkt(string NazwaAktu, char Sciezka)
{
    cout << "---------------------------------------------------" << endl;           
    cout << NazwaAktu << " - ";
 
    if (Sciezka == 'p') cout << Przyborow.strCaloscNazwy << endl;
    else if (Sciezka == 's') cout << Slonsk.strCaloscNazwy << endl;
 
    cout << "---------------------------------------------------" << endl;
    cout << "Imie i nazwisko bohatera: " << Gracz.strImie << " " << Gracz.strNazwisko << endl;
    cout << "Przydomek bohatera: " << Gracz.strPrzydomek << endl;
    cout << "Gra po stronie: ";
 
    if (Sciezka == 'p') cout << "Ksiestwa Przyborowskiego" << endl;
    else if (Sciezka == 's') cout << "Imperium Slonska" << endl;
 
    cout << "Punkty zycia: " << Gracz.nZycie << endl;
    cout << "Stan zdrowia: ";
 
    if (Gracz.nZycie = 100) cout << "Wysmienity" << endl;
    else if (Gracz.nZycie > 90 && Gracz.nZycie < 100) cout << "Bardzo dobry" << endl;
    else if (Gracz.nZycie > 60 && Gracz.nZycie < 90) cout << "Dobry" << endl;
    else if (Gracz.nZycie > 45 && Gracz.nZycie < 60) cout << "Przecietny" << endl;
    else if (Gracz.nZycie > 30 && Gracz.nZycie < 45) cout << "Zly" << endl;
    else if (Gracz.nZycie > 15 && Gracz.nZycie < 30) cout << "Bardzo zly" << endl;
    else if (Gracz.nZycie > 5 && Gracz.nZycie < 15) cout << "Tragiczny" << endl;
    else if (Gracz.nZycie <= 5) cout << "Na lozu smierci" << endl;
 
    cout << "Reputacja w ";
 
    if (Sciezka == 's') cout << "Imperium";
    else if (Sciezka == 'p') cout << "Ksiestwie Przyborowskim";
 
    cout << ": ";
    if (Gracz.repReputacja == REP_OBCY) cout << "obcy" << endl;
    if (Gracz.repReputacja == REP_ZNANA_TWARZ) cout << "znana twarz" << endl;
    if (Gracz.repReputacja == REP_MIEJSCOWY) cout << "miejscowy" << endl;
    if (Gracz.repReputacja == REP_ZOLNIERZ) cout << "zolnierz" << endl;
    if (Gracz.repReputacja == REP_DORADCA) cout << "doradca" << endl;
    if (Gracz.repReputacja == REP_GENERAL) cout << "general" << endl;
    if (Gracz.repReputacja == REP_OFICER) cout << "oficer" << endl;
    if (Gracz.repReputacja == REP_SZLACHCIC) cout << "szlachcic" << endl;
    if (Gracz.repReputacja == REP_WLADCA) cout << "wladca" << endl;
 
    cout << "---------------------------------------------------" << endl;
}
 
int main()
{
    // bardzo ważne enum'y
    enum NASTAWIENIE_DO_GRACZA { NDG_PRZYJAZNE, NDG_WROGIE, NDG_NEUTRALNE };
    enum REPUTACJA { RG_OBCY, RG_ZNANA_TWARZ, RG_MIEJSCOWY, RG_ZOLNIERZ, RG_SZLACHCIC, RG_DORADCA, RG_GENERAL, RG_OFICER, RG_WLADCA };
    enum OBYWATELSTWO { OB_PRZYBOROW, OB_SLONSK, OB_KOSTRZYN, OB_FRANKFURT, OB_OWNICE, OB_KRZESZYCE };
    enum STAN_FIZYCZNY { STF_ZYWY, STF_MARTWY, STF_CHORY };
    enum RELACJE_MIEDZYNARODOWE { REL_WOJNA, REL_POKOJ, REL_ZAWIESZENIE_BRONI };
 
    // bardzo ważne klasy definiujące postacie w grze
    struct cPOSTAC {
          string strImie, strNazwisko, strPrzydomek;
 
          NASTAWIENIE_DO_GRACZA ndgNastawienie;
          REPUTACJA repReputacja;
          OBYWATELSTWO obObywatelstwo;
          STAN_FIZYCZNY stfStan;
 
          unsigned int nZycie;
    };
 
    struct cPANSTWO {
           string strNazwa, strTytul, strCaloscNazwy;
 
           RELACJE_MIEDZYNARODOWE relRelacje;
 
           unsigned int nMieszkancy, nSurowce;
           int nZloto;
    };
 
    struct cREGION {
           string strNazwa;
 
           OBYWATELSTWO obRegionNalezyDo;
    };
 
    // Przypisanie elementom rozgrywki ze struktur odpowiednich wartości DOMYŚLNYCH NA POCZĄTKU
    // UWAGA! Wartości będą zmieniać się w trakcie rozgrywki
 
/* tutaj byłoby te przypisanie wartości, tyle że dość długie jest i nie wiem czy zamieszczać, NA PRZYKŁAD...
    Slonsk.strNazwa = "Slonsk";
    Slonsk.strTytul = "Imperium";
    Slonsk.strCaloscNazwy = "Imperium Slonskie";
    Slonsk.relRelacje = REL_POKOJ;
    Slonsk.nMieszkancy = 1455;
    Slonsk.nSurowce = 52000;
    Slonsk.nZloto = 12000000; */
 
    // Wstep do opowiesci
    cout << "---------------------------------------------------" << endl;
    cout << " ROZMOWA..." << endl;
 
    Gracz.nZycie = 10;
    Gracz.stfStan = STF_CHORY;
 
    cout << "ROZMOWA... " << endl;
 
    cout << "" << endl << endl;
    // Wybór stronnictwa, decyduje o całej fabule i epilogu
    string WyborStronnictwa;
    cout << "[Za ktora strona chcesz sie opowiedziec? - DECYZJA NA CALA GRE!]" << endl;
    cout << "Przyborow | Slonsk" << endl;
    do {
        cin >> WyborStronnictwa;
    } while (WyborStronnictwa != "Przyborow" && WyborStronnictwa != "Slonsk");
 
    if (WyborStronnictwa == "Przyborow") {
                         /* Gra po stronie Przyborowa */ 
                         Gracz.obObywatelstwo = OB_PRZYBOROW; 
                         cout << "- Pojde z wami, do Przyborowa." << endl;
    }
    else {
         /* Gra po stronie Słońska */
         Gracz.obObywatelstwo = OB_SLONSK;
         cout << "- Chodzmy do Slonska, zolnierze." << endl;
    }
 
    Dalej();
 
    /* SCIEŻKA PRZYBOROWA                                PROLOG
    -----------------------------------------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------------------------------------
    */
 
    KolejnyAkt("PROLOG", 'p');
 
    if (Gracz.obObywatelstwo == OB_PRZYBOROW)
    {
 
       Dalej();
 
    }
     // w tworzeniu
 
    getch();
    return 0;
}

Pozostało 580 znaków

2011-08-18 21:53
Kumashiro
0

Error jest uzasadniony. Nie masz enumów REP* (masz za to RG* ale one i tak nie będą widoczne w funkcji).
Może zastanów się czy nie byłoby... rozsądniejsze wyjęcie deklaracji enumów poza main(). Pomyśl też o zastosowaniu klas zamiast struktur.

Struktury też nie są widoczne w funkcji. Ogólnie bajzel w tym kodzie jest. - Kumashiro 2011-08-18 22:04
struktura = klasa (poza widocznością) - maciejmt 2011-08-18 22:22
Tak, ale klasy są przyjemniejsze w użyciu jeśli chodzi o dziedziczenie czy chociażby metody, czyli to co w tym przypadku bardzo by się przydało. - Kumashiro 2011-08-18 23:04

Pozostało 580 znaków

2011-08-18 22:31
von_ilnicki
0

dziękuję za pomoc.
[quote]ogólnie bajzel w tym kodzie jest[/quote]
wiem, muszę się wreszcie nauczyć rozkładać go na pojedyncze pliki .h i .cpp a nie wszytko w jednym...

Pozostało 580 znaków

2011-08-18 23:00
Kumashiro
0

Kiedy zaczynałem z C też podchodziłem do dzielenia kodu na pliki jak do jeża, ale potem przekonałem się, że nie ma w tym nic magicznego, ani trudnego. Zasada jest bardzo prosta: rozrzucasz kod na pliki .c/.cpp, tworzysz do nich pliki .h z deklaracjami, a w plikach źródłowych które korzystają z obiektów w innych plikach includujesz odpowiedni plik nagłówkowy (.h). To jest cała filozofia.
Przykładowo w Twoim kodzie zrobiłbym tak (zakładając, że nadal chcesz to robić na strukturach, a nie klasach):

  1. w pliku country.h umieściłbym strukturę przechowującą dane państwa oraz deklaracje funkcji na niej operujących, zaś w pliku coutry.cpp kod tych funkcji,
  2. analogicznie dla regionu stworzyłbym plik region.h oraz region.cpp,
  3. analogicznie dla gracza - player.h i player.cpp.

Nie wiem jak chcesz zorganizować akty (i co właściwie one robią), ale można pomyśleć o wydzieleniu także ich.
W ten sposób struktury i funkcje operujące na graczu (np. funkcja zwracająca *const char** opisujący stan zdrowia gracza) będą zgrupowane w jednym miejscu, ale będzie można ich używać w kilku.

Budowanie np. krajów można umieścić w pliku country.cpp lub w oddzielnym, jednakże to aż się prosi o wczytywanie danych z zewnątrz. Hardkodowanie takich rzeczy jest zabawne (do pewnego momentu), ale uciążliwe w utrzymaniu i generuje mnóstwo redundantnego kodu. Pomyśl co będzie kiedy zdefiniujesz sobie np. 300 krajów, a w trakcie rozwoju postanowisz dodać jakiś nowy element do struktury... ponad 300 zmian w kodzie potrafi zniechęcić nawet najwytrwalszych (chociaż przy użyciu odpowiednich narzędzi można ten ból zmniejszyć).

Pozostało 580 znaków

2011-08-18 23:21
von_ilnicki
0

ciekawe rady, jestem bardzo wdzięczny.
próbowałem takie pliki stworzyć jednak ciągle mam błędy z niewykrywaniem przez kompilator ich deklaracji. trzeba używac externu?

Pozostało 580 znaków

2011-08-18 23:33
von_ilnicki
0

przepraszam że tak was nękam ale umieszczając w country.cpp danych do struktur musze je wziąć pod main'a, a includujac plik w glownym pliku spowoduje wystapienie dwoch main'ów!

Pozostało 580 znaków

2011-08-19 00:11
Kumashiro
0

Nie, nie, nie... nie.
Funkcja main() może być tylko jedna. Nie twórz jej innych plikach. Przykład:

Plik country.h:

struct country { ... };
 
int  country_blah(struct country  *cn);
const char *country_foo(struct country  *cn, int  bar);

Plik country.cpp:

#include "country.h"
 
int country_blah(struct country  *cn) { ... }
 
const char *country_foo(struct country  *cn, int  bar) { ... }

Plik game.cpp:

#include "country.h"
 
int main(void)
{
    struct country  country_foobaria;
    int     blah;
 
    // ...
    blah = country_blah(&country_foobaria);
 
    // ...
    printf("Foo in %s is %s\n", country_foobaria.name, country_foo(&country_foobaria, 666));
 
    // ...
}

Potem kompilujesz to tak (przykład dla g++, sprawdź w dokumentacji jak wywoływać Twój kompilator):
g++ -o game country.cpp game.cpp

Albo zgodnie ze sztuką:

g++ -o country.o -c country.cpp
g++ -o game.o -c game.cpp
g++ -o game country.o game.o

Pozostało 580 znaków

2011-08-19 00:58
von_ilnicki
0

ale czemu do game.cpp nie można przypisać np. country.cpp?
jak wartości tam dodane będą uwzględnione w game?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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