• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Błąd przy przekazaniu parametrów do funkcji

Object Storage Arubacloud
0 głosów
220 wizyt
pytanie zadane 25 sierpnia 2015 w C i C++ przez tomasztopolewski Początkujący (430 p.)
zamknięte 25 sierpnia 2015 przez tomasztopolewski
||=== Build: Release in project1(compiler: GNU GCC Compiler) ===|
D:\C++\project1\main.cpp||In function 'void zapiszUstawienia()':|
D:\C++\project1\main.cpp|56|error: 'zamek1' was not declared in this scope|
D:\C++\project1\main.cpp|56|error: 'nzwa' was not declared in this scope|
D:\C++\project1\main.cpp|57|error: 'wlasc' was not declared in this scope|
D:\C++\project1d\main.cpp|58|error: 'procentProdkcj1' was not declared in this scope|
D:\C++\project1\main.cpp|58|error: 'prcn' was not declared in this scope|
D:\C++\project1\main.cpp|59|error: 'ludnosc1' was not declared in this scope|
D:\C++\project1\main.cpp|59|error: 'ldnsl' was not declared in this scope|
D:\C++\project1\main.cpp|60|error: 'nastroj1' was not declared in this scope|
D:\C++\project1main.cpp|60|error: 'nastr' was not declared in this scope|
||=== Build failed: 9 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

Witam.

W programie utworzyłem kilka class przechowujących pewne parametry. W tym jeden class'a ma 2 funkcje pobierającą nazwe i nick. Każda klasa ma konstruktor. 

Mój problem polega na tym, iż chciałbym stworzyć funkcję, która te dane (parametry z class) zapisze do pliku.

W tym celu stworzyłem voida w głównym pliku programu (main.cpp), pod include zaznaczyłem iż taka funkcja istnieje, a pod funkcją główną (int main) stworzyłem jej ciało.. (funkcję stworzyłem oczywiście za

return i "}"  ). 

void zapiszUstawienia(string nzwa, string wlascl, int prcnt, int ludns, float nstrj);

W funkcji zapisującej, którą nazwałem "zapiszUstawienia" utworzyłem zmienną fstream (bibliotekę też dodałem). I teraz nie wiem jak przekazać tej funkcji zapisującej ustawienia paramerty moich obiektów:

void zapiszUstawienia()
{
    fstream otwarty_plik1;
    otwarty_plik1.open("ustawienia.txt", ios::out);
    if(otwarty_plik1.good()==false) cout<<"Nie udalo sie uruchomic pliku! ";

    zamek1.nazwa = nzwa;
    zamek1.wlasciciel = wlasc;
    procentProdkcj1.procent_prodkcj = prcn;
    ludnosc1.ludnosc = ldnsl;
    nastroj1.nastroj = nastr;

    otwarty_plik1<<nzwa;
    otwarty_plik1<<wlasc;
    otwarty_plik1<<prcn;
    otwarty_plik1<<ldnsl;
    otwarty_plik1<<nastr;

    otwarty_plik1.close();
}

Funkcji przekazałem także parametry, które chciałbym w niej zapisać:

zapiszUstawienia(zamek1.nazwa, zamek1.wlasciciel, procentProdkcj1.procent_prodkcj, ludnosc1.ludnosc, nastroj1.nastroj);

Obiekty także zostały stworzone. Dałem także funkcji "zapiszUstawienia" zaprzyjaźnienie z wszystkimi klasami. 

Przykładowa klasa w pliku nagłówkowym:

class Zamek
{
public:
    string nazwa;
    string wlasciciel;

    friend void zapiszUstawienia();
    Zamek(string="Zamek nr 1", string="Krol I");

    void podajNazwe();
    void podajWlasciciela();
};

A to błędy, które wywalił kompilator. 

Ma ktoś jakiś pomysł jak to rozwiązać?

 

 

komentarz zamknięcia: Problem został rozwiązany.

3 odpowiedzi

+1 głos
odpowiedź 25 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
edycja 25 sierpnia 2015 przez Szykem2
Jak dla mnie te błędy są wynikiem nie zadeklarowania tychże zmiennych przynajmniej ja tu nigdzie deklaracji nie widzę.

EDIT: Brak argumentów w funkcji zapiszUstawienia
komentarz 25 sierpnia 2015 przez tomasztopolewski Początkujący (430 p.)

Deklarowałem zmienne i nic. Te same błędy.

Oczywiście jeśli mówimy o tych zmiennych:

string nzwa; string wlascl; int prcnt; int ludns; float nstrj;

 

komentarz 25 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Tak mówimy o tych ale chodzi mi o to, że w definicji funkcji nie ma nic o tych zmiennych, a chcesz do nich coś przypisać. I przy tej definicji musisz mieć globalne obiekty Zamek1 ProcentProdukcji1 ludnosc1 i nastroj1
komentarz 25 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)

Ta definicja:

void zapiszUstawienia(string nzwa, string wlascl, int prcnt, int ludns, float nstrj)
{
    fstream otwarty_plik1;
    otwarty_plik1.open("ustawienia.txt", ios::out);
    if(otwarty_plik1.good()==false) cout<<"Nie udalo sie uruchomic pliku! ";
 
    zamek1.nazwa = nzwa;
    zamek1.wlasciciel = wlasc;
    procentProdkcj1.procent_prodkcj = prcn;
    ludnosc1.ludnosc = ldnsl;
    nastroj1.nastroj = nastr;
 
    otwarty_plik1<<nzwa;
    otwarty_plik1<<wlasc;
    otwarty_plik1<<prcn;
    otwarty_plik1<<ldnsl;
    otwarty_plik1<<nastr;
 
    otwarty_plik1.close();
}

Jak jest funkcją zaprzyjaźnioną to nie musi być metodą klasy, ale jak już pisałem obiekty musiałyby być globalne, albo również przekazane do funkcji. I w deklaracji przyjaźni też brakuje argumentów, bo zaprzyjaźniasz jakąś przeładowaną wersję tej funkcji a nie tą, której używasz.

komentarz 25 sierpnia 2015 przez tomasztopolewski Początkujący (430 p.)

Czy pełen zapis powinien wyglądać tak?

friend void zapiszUstawienia(string nzwa, string wlascl, int prcnt, int ludns, float nstrj);

 

komentarz 25 sierpnia 2015 przez tomasztopolewski Początkujący (430 p.)
Nadal te same błędy nawet jak z deklaracji przyjaźni dodałem argumenty.
komentarz 25 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Sprawdź czy wszędzie gdzie masz tą funkcję są podane argumeny i czy obiekty są globalne.
+1 głos
odpowiedź 25 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)
A gdzie argumenty w definicji metody?
komentarz 25 sierpnia 2015 przez tomasztopolewski Początkujący (430 p.)
W której metodzie? "zapiszUstawienia"?

"zapiszUstawienia" jest funkcją stworzoną w główym pliku, nie jest obiektem, a nie została zdefinionawna przez klasę.
komentarz 25 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

Powinno to tak wyglądać:

class foo
{
//...
	void zapiszUstawienia(string nzwa, string wlascl, int prcnt, int ludns, float nstrj)
	{
   		fstream otwarty_plik1;
    		otwarty_plik1.open("ustawienia.txt", ios::out);
    		if(otwarty_plik1.good()==false) cout<<"Nie udalo sie uruchomic pliku! ";
 
    		zamek1.nazwa = nzwa;
    		zamek1.wlasciciel = wlasc;
    		procentProdkcj1.procent_prodkcj = prcn;
    		ludnosc1.ludnosc = ldnsl;
    		nastroj1.nastroj = nastr;
 
    		otwarty_plik1<<nzwa;
    		otwarty_plik1<<wlasc;
    		otwarty_plik1<<prcn;
    		otwarty_plik1<<ldnsl;
    		otwarty_plik1<<nastr;
 
    		otwarty_plik1.close();
	}
};

EDIT: Nie zauważyłem, że jest to zwykła funkcja. To tylko usuń tę klasę foo z kodu wink

komentarz 25 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)
A te obiekty zrób globalne, czy coś... mają być po prostu widoczne w funkcji.
komentarz 25 sierpnia 2015 przez tomasztopolewski Początkujący (430 p.)
Niestety nadal te same błędy.

 

EDIT: Jak zrobić elementy globalne? W sensie dać public?
komentarz 25 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Elementy globalne deklarujesz przed mainem
komentarz 25 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

Nie znam deklaracji twojej klasy, więc nie wiem, czy te składowe są publiczne, czy nie, ale jeśli nie są, to robi się to wpisując deklaracje pól i metod po operatorze public:

class foo
{
public:
//...
};

Ale tutaj jest także problem, że funkcja zapiszUstawienia nie widzi obiektów tej twojej klasy, więc musisz je zrobić globalne, lub stworzyć je w funkcji, lub wysłać argumentem... masz szeroki wybór.

komentarz 25 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

No to tylko został problem widoczności obiektów tych twoich klas w funkcji zapiszUstawienia (patrz wyżej).

komentarz 25 sierpnia 2015 przez tomasztopolewski Początkujący (430 p.)
Mam pytanie:

w jaki sposób mogę uczynić obiekty, obiektami globalnymi?

W internecie znalazłem coś o polu statycznym.
komentarz 25 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Obiekty globalne deklarujesz przed funkcją main()
komentarz 25 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)
Jeśli pole klasy ma związek z nią, a nie z każdym obiektem (jakby zmienna/stała klasowa), to możesz ją ustawić na pole statyczne. Jeśli tak nie jest, to radzę wysyłać obiekty argumentami.
0 głosów
odpowiedź 25 sierpnia 2015 przez tomasztopolewski Początkujący (430 p.)

Dzięki wielkie za pomoc. 

Tak jak poradził @Patrycjerz  zdeklarowałem obiekty globalnie i wszystko działa, zero bugów.

Jeszcze raz dzięki za pomoc. 

Podobne pytania

0 głosów
0 odpowiedzi 897 wizyt
pytanie zadane 14 października 2017 w Python przez chacken Użytkownik (820 p.)
0 głosów
1 odpowiedź 252 wizyt
pytanie zadane 17 stycznia 2017 w C i C++ przez BeSSeSSt Obywatel (1,190 p.)
0 głosów
4 odpowiedzi 2,663 wizyt
pytanie zadane 19 lipca 2016 w JavaScript przez Madar Obywatel (1,560 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...