Witam,
pewnie banalne, ale rozwiązania szukam, szukam i nie mogę znaleźć - pewnie nie wiem czego szukać…
Przykład problemu:
class Zespolona{
public:
float Re;
float Im;
}
class KlasaPosredniczaca{
public:
Zespolona TabStosu[ROZMIAR];
public:
void Zapisz(Zespolona Z);
Zespolona Daj(int Indeksik);
};
void KlasaPosredniczaca::Zapisz(Zespolona Z){
TabStosu[Indeks++]=Z;
}
Zespolona KlasaPosredniczaca::Daj(int Indeks){
return TabStosu[Indeks];
}
class KlasaGlowna{
private:
KlasaPosredniczaca Stos;
public:
Zespolona DodajDwie();
Zespolona MnozDwie();
};
Zespolona KlasaGlowna::DodajDwie(){
return Stos.TabStosu[Indeks-1]=Stos.TabStosu[Indeks]+Stos.TabStosu[Indeks-1];
}
Problem:
Wywołując w main() funkcje “KlasaGlowna.DodajDwie()” otrzymuje wynik-śmieci. Problem jest pomiędzy KlasaPosredniczaca a KlasaGlowna(dane się właśnie nie przekazują), jak to się powinno robić?
(oczywiście po drodze są przęciążenia wejscia/wyjscia, znaku +/* - działające dobrze(sprawdzone))
JCoder
(Pkolaczk)
23 Maj 2009 17:01
#2
Debuggera nie masz? Na oko z kodem jest wszystko ok. Problem leży raczej poza tym co wkleiłeś. Jesteś pewien, że indeksem nie wyjeżdżasz poza rozmiar stosu?
Indeksu nie przekroczyłem. Już to tak wytestowałem/zmodyfikowałem, że nie mam prawie gdzie;P.
Cały kod programu w wersji testowej(kompilujący się, wideć te wyniki-śmieci):
# include
using namespace std;
# define ROZMIAR 10
int Indeks=2;
class Zespolona{
//private:
public:
float Re;
float Im;
public:
//przeciazenie dla dodawania dwoch liczb zespoloncyh
Zespolona operator +(Zespolona Z){
Zespolona Suma;
Suma.Re=Re+Z.Re;
Suma.Im=Im+Z.Re;
return Suma;
}
Zespolona operator -(Zespolona Z){
Zespolona Suma;
Suma.Re=Re-Z.Re;
Suma.Im=Im-Z.Re;
return Suma;
}
Zespolona operator *(Zespolona Z){
Zespolona Iloczyn;
Iloczyn.Re=Re*Z.Re-Im*Z.Im;
Iloczyn.Im=Re*Z.Im+Im*Z.Re;
return Iloczyn;
}
Zespolona operator /(Zespolona Z){
Zespolona Iloraz;
Iloraz.Re=(Re*Z.Re+Im*Z.Im)/
(Z.Re*Z.Re+Z.Im*Z.Im);
Iloraz.Im=(Im*Z.Re-Re*Z.Im)/
(Z.Re*Z.Re+Z.Im*Z.Im);
return Iloraz;
}
};
//Przeciazenie operatora wejswcia
istream & operator >> (istream & StrmWej, Zespolona & Z){
char Znak;
StrmWej>>Z.Re;
StrmWej>>Znak;
if(!(Znak=='+'||Znak=='-')){cerr<<"niepoprawny format (1)";exit(1);}
StrmWej>>Z.Im;
if(Znak=='-'){Z.Im=-Z.Im;}
StrmWej>>Znak;
if(Znak!='i'){cerr<<"niepoprawny format (2)";}
return StrmWej;
}
//Przeciazenie operatora wyjscia
ostream &operator <<(ostream &ostrm, Zespolona Z){
if(Z.Im<0){
return ostrm <
}else{
return ostrm <
}
}
class KlasaPosredniczaca{
public:
Zespolona TabStosu[ROZMIAR];
public:
void Zapisz(Zespolona Z);
Zespolona Daj(int Indeksik);
};
void KlasaPosredniczaca::Zapisz(Zespolona Z){
TabStosu[Indeks++]=Z;
}
Zespolona KlasaPosredniczaca::Daj(int Indeks){
return TabStosu[Indeks];
}
class KlasaGlowna{
//private:
public:
KlasaPosredniczaca Stos;
public:
Zespolona DodajDwie();
Zespolona MnozDwie();
};
Zespolona KlasaGlowna::DodajDwie(){
return Stos.Daj(Indeks)+Stos.Daj(Indeks-1);
//return Stos.TabStosu[Indeks-1]=Stos.TabStosu[Indeks]+Stos.TabStosu[Indeks-1];
}
Zespolona KlasaGlowna::MnozDwie(){
return Stos.TabStosu[Indeks-1]=Stos.TabStosu[Indeks]*Stos.TabStosu[Indeks-1];
}
void WyswietlMenu(){
cout<<"This is MENU"<
}
int main(){
Zespolona Z;
KlasaPosredniczaca KP;
KlasaGlowna KG;
KP.TabStosu[0].Re=2;
KP.TabStosu[0].Im=2;
KP.TabStosu[1].Re=5;
KP.TabStosu[1].Im=-3;
KP.TabStosu[2].Re=4;
KP.TabStosu[2].Im=4;
KP.TabStosu[3].Re=5;
KP.TabStosu[3].Im=5;
WyswietlMenu();
cout<<"Mnoż: "<
cout<<"Dodaj: "<
cout<<"\nTablica z KlasyPosredniczacej: "<
cout<<"Tablica poprzez KlaseGlowna: "<
cout<<"Daj: "<
cin>>Z;
return 0;
}
Debugger? Jeszcze gdybym wiedział jak go zastosować przy tym problemie.
nr47
(Sawyer47)
23 Maj 2009 18:27
#4
Definiujesz obiekt KlasaGlowna KG; ale nie wpisujesz tam żadnych danych, więc wszelkie operacje na tym obiekcie nie mają sensu. że nie wspomnę już o używanie zmiennej globalnej wewnątrz klasy…
Zulowski
(Zulowski)
23 Maj 2009 19:16
#5
Hmm, jak to jak, dodajesz zmienne których wartość Cię interesuje, ustawiasz sobie break-pointa zaraz przed rozpoczeciem dzialan na nich, i wykonujesz krok po kroku, sprawdzając wartosci i wykonywanie kodu…
Chyba jedno z najprostszych zastosowań.