Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z wywołaniem metody w funkcji main...

Ostatnio zmodyfikowano 2015-02-05 00:43
Autor Wiadomość
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:
C/C++
#include <iostream>
#include <fstream> // praca na pliku
#include <sstream> // do konwersji int do string
#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( /*s1.show() == 'T' || s1.show() == */ 't' ) t1.naglowek_tab();
        else
        if( /*s1.show() == 'N' || s1.show() == */ '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
C/C++
#include <iostream>
#include <fstream> // praca na pliku
#include <sstream> // do konwersji int do string

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(); //podaj miesiac
    void naglowek_tab();
    void dodaj_wydarzenie();
   
    friend class Show_task;
};
////////////////////////////////////////
class Show_task
{
    fstream plik;
    char tn;
   
public:
    char show();
};

add_task.cpp
C/C++
#include <iostream>
#include <fstream> // praca na pliku
#include <sstream> // do konwersji int do string
#include "terminarz.h"

void Add_task::p_miesiac() //podaj 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;
    ////////////////////////////////////////////////////////
    // data do string //
    stringstream d_s; //dzien do string
    string dzien_s;
    d_s << dzien;
    d_s >> dzien_s;
    stringstream r_s; //rok do string
    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 );
    // TWORZENIE PLIKU TXT
    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
C/C++
#include <iostream>
#include <fstream> // praca na pliku
#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;
    }
}
P-125973
darko202
» 2015-02-04 07:37:56
w metodzie brak return
np.
C/C++
char Show_task::show()
{...
    return tn; ///brak
}



 
P-125975
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ą:
C/C++
switch( wybor_M )
{
case 1:
    t1.dodaj_wydarzenie();
    break;
case 2:
    char T = s1.show();
    if( /*s1.show() == 'T' || s1.show() == */ T == 't' ) t1.naglowek_tab();
    else
         if( /*s1.show() == 'N' || s1.show() == */ 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 :)
P-125980
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ą ?
P-125981
daragen
Temat założony przez niniejszego użytkownika
» 2015-02-05 00:43:46
Ostatecznie
case 2:
 wygląda tak:
C/C++
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
P-126015
« 1 »
  Strona 1 z 1