daragen Temat założony przez niniejszego użytkownika |
Problem z wywołaniem metody w funkcji main... » 2015-02-04 01:55:17 Witam, mam problem z wyborem zmiennej char z metody w funkcji głównej main... Problem ten pojawia się w case 2: , nie wiem jak się odnieść dokładnie do wyniku zastosowanej metody. W komentarzach zostawiłem poprzednie próby. Dlaczego jeżeli powołuję się w if... na metodę to jest ona wyświetlana za każdym razem (czyli bez komentarzy wyświetla się 5 razy) ? W takiej formie jak jest teraz, program zachowuje się jakby zupełnie ignorował "ify", i wykonuje kolejno czynności, bez znaczenia jaki padnie wybór... Program tworzę, żeby potrenować na edycji plików oraz nauczyć się klas. Jest on w czterech plikach, załączam wszystkie, jednak myślę, że wystarczy się przyjrzeć main.cpp i show.cpp... Z góry dzięki za pomoc... main.cpp: #include <iostream> #include <fstream> #include <sstream> #include "terminarz.h"
using namespace std;
Add_task t1; Show_task s1; fstream plik; string kolumna; string zadanie, miesiac_s; int dzien, miesiac, rok; int wybor_M;
void menu() { cout << " TERMINARZ " << endl; cout << "====================" << endl; cout << "1. Dodaj wydarzenie." << endl; cout << "2. Wyswietl zadania." << endl; cout << "3. Edytuj terminarz." << endl; cout << "4. Pomoc." << endl; cout << "5. Koniec." << endl; cin >> wybor_M; }
int main() { menu(); switch( wybor_M ) { case 1: t1.dodaj_wydarzenie(); break; case 2: s1.show(); if( 't' ) t1.naglowek_tab(); else if( 'n' ) cout << "a"; break; case 3: cout << "Edycja"; break; case 4: cout << "Pomoc"; break; case 5: cout << "Wyjscie"; break; } plik.close(); return 0; }
terminarz.h #include <iostream> #include <fstream> #include <sstream>
using namespace std;
class Show_task; class Add_task { fstream plik; string kolumna; string zadanie, miesiac_s; int dzien, miesiac, rok; public: void p_miesiac(); void naglowek_tab(); void dodaj_wydarzenie(); friend class Show_task; };
class Show_task { fstream plik; char tn; public: char show(); };
add_task.cpp #include <iostream> #include <fstream> #include <sstream> #include "terminarz.h"
void Add_task::p_miesiac() { cout << "Podaj miesiac: " << endl; cout << "[1] Styczen" << endl; cout << "[2] Luty" << endl; cout << "[3] Marzec" << endl; cout << "[4] Kwiecien" << endl; cout << "[5] Maj" << endl; cout << "[6] Czerwiec" << endl; cout << "[7] Lipiec" << endl; cout << "[8] Sierpien" << endl; cout << "[9] Wrzesien" << endl; cout << "[10] Pazdziernik" << endl; cout << "[11] Listopad" << endl; cout << "[12] Grudzien" << endl; }
void Add_task::naglowek_tab() { plik.close(); plik.open( "terminarz.txt", ios::out ); plik << "=====================================================================" << endl; plik << "| DATA | WYDARZENIE |" << endl; plik << "=====================================================================" << endl; plik.close(); }
void Add_task::dodaj_wydarzenie() { cout << "Podaj dzien: " << endl; cin >> dzien; p_miesiac(); cin >> miesiac; switch( miesiac ) { case 1: miesiac_s = "styczen"; break; case 2: miesiac_s = "luty"; break; case 3: miesiac_s = "marzec"; break; case 4: miesiac_s = "kwiecien"; break; case 5: miesiac_s = "maj"; break; case 6: miesiac_s = "czerwiec"; break; case 7: miesiac_s = "lipiec"; break; case 8: miesiac_s = "sierpien"; break; case 9: miesiac_s = "wrzesien"; break; case 10: miesiac_s = "pazdziernik"; break; case 11: miesiac_s = "listopad"; break; case 12: miesiac_s = "grudzien"; break; default: cout << "Zly wybor"; } cout << "Podaj rok: "; cin >> rok; stringstream d_s; string dzien_s; d_s << dzien; d_s >> dzien_s; stringstream r_s; string rok_s; r_s << rok; r_s >> rok_s; string data = dzien_s + " " + miesiac_s + " " + rok_s; cout << "Podaj wydarzenie na " << data << ": "; cin.sync(); getline( cin, zadanie ); kolumna = " "; plik.open( "terminarz.txt", ios::out | ios::app ); kolumna.insert( 0, "|" ); kolumna.insert( 2, data ); kolumna.insert( 22, "|" ); kolumna.insert( 24, zadanie ); kolumna.insert( 68, "|" ); plik << kolumna << endl; plik << "---------------------------------------------------------------------" << endl; }
show.cpp #include <iostream> #include <fstream> #include "terminarz.h"
using namespace std;
char Show_task::show() { plik.open( "terminarz.txt", ios::in ); if( plik.good() == false ) { cout << "Plik nie istnieje." << endl; cout << "Czy chcesz teraz stworzyc plik terminarza ? (T/N): "; cin >> tn; } }
|
|
darko202 |
» 2015-02-04 07:37:56 w metodzie brak return np. char Show_task::show() {... return tn; }
|
|
daragen Temat założony przez niniejszego użytkownika |
» 2015-02-04 12:19:03 Tak, ale return nie pomaga. EDIT Chciałem zastąpić wynik metody nową zmienną: switch( wybor_M ) { case 1: t1.dodaj_wydarzenie(); break; case 2: char T = s1.show(); if( T == 't' ) t1.naglowek_tab(); else if( T == 'n' ) cout << "a"; break; case 3: cout << "Edycja"; break; case 4: cout << "Pomoc"; break; case 5: cout << "Wyjscie"; break; }
, i wychodzi taki komunikat błędu: ||=== Build: Debug in terminarz (compiler: GNU GCC Compiler) ===| ||In function 'int main()':| |42|error: jump to case label [-fpermissive]| |37|error: crosses initialization of 'char T'| |45|error: jump to case label [-fpermissive]| |37|error: crosses initialization of 'char T'| |48|error: jump to case label [-fpermissive]| |37|error: crosses initialization of 'char T'| |37|warning: unused variable 'T' [-Wunused-variable]| ||=== Build failed: 6 error(s), 1 warning(s) (0 minute(s), 1 second(s)) ===|
EDIT: zmienną char T , stworzyłem jako globalną, a w case 2: wpisałem T = s1.show(); i jakoś zadziałało :) |
|
darko202 |
» 2015-02-04 12:41:02 1. "error: jump to case label" -> google -> http://cpp0x.pl/forum/temat/?id=189 "Jeśli chcesz deklarować zmienne w case, musisz opakowywać je w bloki" ( DejaVu ) 2. zmienną tn masz chyba niezadeklarowaną ? |
|
daragen Temat założony przez niniejszego użytkownika |
» 2015-02-05 00:43:46 Ostatecznie case 2: wygląda tak: case 2: open_P = s1.open_p(); if( open_P == false ) { do { tnM = s1.show_false(); if( tnM == 'T' || tnM == 't' ) t1.naglowek_tab(); else if( tnM == 'N' || tnM == 'n' ); else if( tnM != 'n' && tnM != 'N' && tnM != 't' && tnM != 'T' ) cout << "Zly wybor." << endl; } while( tnM != 'n' && tnM != 'N' && tnM != 't' && tnM != 'T' ); } else if( open_P == true ) s1.show_true();
break;
Faktycznie z tymi blokami przyszło mi później i zadziałało. Co do metod to przyrównuje je do zmiennych, w innym wypadku jest wykonywana cała metoda, zamiast oddawania wyniku. Odnośnie zmiennej tn to jest ona zadeklarowana w pliku .h. Ah, i metoda show (tutaj po zmianie show_false) faktycznie zwraca return tn |
|
« 1 » |