Klasa nie przelicza.

0

Witam,
Mam problem z funkcją przeliczająca oraz po wprowadzeniu np. 'kb' program wyłącza się. Proszę o wskazówkę jak uporać się z tym problemem.

//przelicznik.h
#include <iostream>
enum JEDNOSTKA{J_BAJT = 'b',
				J_KILOBAJT ='kb',
				J_MEGABAJT ='mb',
				J_GIGABAJT ='gb'};

class CCals{
private:
	double m_dBajt;
public:
	void Przelicznik(double,JEDNOSTKA);

	double PobierzJednostke(JEDNOSTKA);
};
//////////////////////////////////////////////////////////////////////////////////////////// 
//przelicznik.cpp
#include "przelicznik.h"

void CCals::Przelicznik(double dJednostka,JEDNOSTKA jed)
{
	switch(jed)
	{
		case J_BAJT:
			m_dBajt = dJednostka;
			break;
		case J_KILOBAJT:
			m_dBajt = dJednostka * 1000 // to może być źle;
			break;
		case J_MEGABAJT:
			m_dBajt = dJednostka * 1000000 // to może być źle;
			break;
		case J_GIGABAJT:
			m_dBajt = dJednostka * 1000000000000 // to może być źle;
			break;
	}
}

double CCals::PobierzJednostke(JEDNOSTKA jed)
{
	switch(jed)
	{
		case J_BAJT: return m_dBajt;
		case J_KILOBAJT: return m_dBajt;
		case J_MEGABAJT: return m_dBajt;
		case J_GIGABAJT: return m_dBajt;
		default : return 0;
	}
}
/////////////////////////////////////////////////////////////////////////////////////////
//main.cpp
#include <iostream>
#include <conio.h>
#include "przelicznik.h"
using namespace std;

int main()
{
	char chJednostka;
	do
	{
	cout << "\tWybierz wejsciowa skale informacji\n";
	cout << "(b - bajt, kb - kilobajt, mb - megabajt, gb - gigabajt) : ";
	cin>>chJednostka;
	if(chJednostka != 'b'&& chJednostka != 'kb' && chJednostka != 'mb' && chJednostka != 'gb') return;
	float jed;
	cout << "Podaj wiekosc danej: ";
	cin>>jed;
	CCals Kalkulator;
	Kalkulator.Przelicznik(jed,static_cast<JEDNOSTKA>(chJednostka));
	cout << endl;
	cout << "- bajty: "<<Kalkulator.PobierzJednostke(J_BAJT)<<endl;
	cout << "- kilobajt: "<<Kalkulator.PobierzJednostke(J_KILOBAJT)<<endl;
	cout << "- megabajt: "<<Kalkulator.PobierzJednostke(J_MEGABAJT)<<endl;
	cout << "- gigabajt: "<<Kalkulator.PobierzJednostke(J_GIGABAJT)<<endl;
	}while(chJednostka != 0);
	getch();
	
}
0

W enumie do literału znakowego podajesz stringa. Komiluje Ci się to w ogóle?

0

Kompiluje bez problemu

0

@patryj1083
kłamiesz. To się nie kompiluje.

m_dBajt = dJednostka * 1000

jak to Ci się kompiluje to gratulacje. Znalazłeś mega buga w c++

0

A czego używasz?

0

chłopie tu nie ma średnika... to nie może Ci się kompilować koniec kropka.

BTW nie wiem czy wiesz, ale ten enum będzie zawierał w sobie liczby. Jeżeli wiesz o tym to ok. Jeżeli nie to spójrz tutaj

http://ideone.com/ZaRhqy

EDIT
jeszcze jest jedna sprawa. do zmiennej char chcesz wpisać dwa znaki. Tak się nie da. Użyj klasy string

a wyłącza Ci się ponieważ masz zły if
if(chJednostka != 'b'&& chJednostka != 'kb' && chJednostka != 'mb' && chJednostka != 'gb')

żeby się nie wyłączył musiałby chJednostka być inna niż b, kb, mb, gb. (taki warunek zrobiłeś)
</del>

0

Oj wiem zapomniałem średnika napisać w tym przykładzie, ale i to nie rozwiązuje mojego problemu.

0

masz dane znakowe char chJednostka; i oczekujesz że wejdzie tam kilka znaków?
Musisz poszukać klasy RubberChar.
'kb' - czy tobie kompilator tu nic nie mówi? To czemu go olewasz?

1

@patryj1083

co ma w ogóle ten program przeliczać?

przeliczasz jedną jednostkę (powiedzmy kb) które mnożysz przez 1000 (a nie przez 1024) i dodatkowo później ten wynik do wszystkich jednostek wyświetlasz.
Dodaj do klasy zmienne bajt, kilobajt, megabajt, gigabajt. Podawaj wielkość zawsze w bajtach i przeliczaj
kilobajt = bajt * 1024;
megabajt = kilobajt * 1024;
gigabajt = megabajt * 1024;

wtedy możesz wyświetlić wszystko. lepiej użyc long long int niż double

jeżeli chcesz podawać w danej jednostce to musisz mieć przeciążone funkcje do przeliczania (że raz podajesz kb, raz gb itd)

z mnożeniem jest taka sztuczka (tak samo z dzieleniem) jeżeli jest to potęga dwójki to możesz przesunąć bitowo o tyle jaki wykładnik jest przy dwójce
w tym wypadku będzie
kilobajt = bajt << 10;
ale kompilator i tak to doprowadzi do takiego stanu, dlatego piszę to jako ciekawostka

0

Aha to jakiego wzoru proponujesz użyć ?

0

btw kb to kilobit, mb to milibit i nie ma czegoś takiego, podobnie jak nie ma i gb.

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