Tak jak w temacie, Mam 2 funkcje które przypisują do struktury dane,kłopot w tym, że druga funkcja(pobOceny) zapisuje do struktury niechciane wartości:
_______________________________________________
#include <iostream>
using namespace std;
struct OCENA{
float oc;
};
struct STUDENT{
char imie[25];
OCENA* stopnie[0];
};
STUDENT *Grupa[0];
void pobDane()
{
STUDENT *nowy;
nowy = new STUDENT;
cout<<"Podaj imie: ";
cin.getline(nowy->imie,25);
Grupa[0]=nowy;
}
void pobOceny()
{
STUDENT* nowe;
nowe=new STUDENT;
nowe->stopnie[0] = new OCENA;
cout<<"Podaj ocene: ";
cin>>(nowe->stopnie[0])->oc;
cout<<endl<<"imie--->"<<Grupa[0]->imie<<endl; //Tu jest ok !
Grupa[0]=nowe; //przypisują się przypadkowe wartości do zmiennej imie, czego nie chce.
cout<<endl<<"imie--->"<<Grupa[0]->imie<<endl; //Tu jest błąd !
}
int main(int argc, char *argv[])
{
pobDane();
pobOceny();
system("PAUSE");
return EXIT_SUCCESS;
}
_______________________________________________
Ma ktoś może pomysł na lepsze zapisanie wartości do struktur ? Nie można też dodać linijki
nowe->imie=Grupa[0]->imie;
przed linijką
Grupa[0]=nowe;//przypisują się przypadkowe wartości do zmiennej imie, czego nie chce.
bo wywali błąd: "ISO C++ forbids assignment of arrays"
Struktury mam z góry narzucone.
I nie mogę w jednej funkcji pobrać od razu wszystkich danych.
W jednej funkcji muszę pobrać imię w drugiej oceny.
C++ do struktury przypisują się niechciane wartości
- wafello
- Użytkownik
- Posty: 35
- Rejestracja: 7 sty 2009, o 21:50
- Płeć: Mężczyzna
- Lokalizacja: Józefina
- Pomógł: 6 razy
C++ do struktury przypisują się niechciane wartości
Jeśli tworzysz nowy obiekt to naturalną rzeczą jest że zostaną w nim śmieci.
Masz dwa wyjścia:
1. Ręcznie zerujesz tą pamięć dla każdego nowego obiektu(nie fajny pomysł)
2. Tworzysz konstruktor w którym zerujesz dane.
rozwiązanie drugie ma jeszcze jeden plus w postaci tego, że konstruktor może przyjmować argumenty - możesz przy tworzeniu obiektu od razu nadawać odpowiednie wartości zmiennym.
EDIT:
W twoim programie podejrzewam ze chcesz w drugiej funkcji edytować osobę z pierwszej.
Ale to tylko moje domysły....
Masz dwa wyjścia:
1. Ręcznie zerujesz tą pamięć dla każdego nowego obiektu(nie fajny pomysł)
2. Tworzysz konstruktor w którym zerujesz dane.
rozwiązanie drugie ma jeszcze jeden plus w postaci tego, że konstruktor może przyjmować argumenty - możesz przy tworzeniu obiektu od razu nadawać odpowiednie wartości zmiennym.
EDIT:
W twoim programie podejrzewam ze chcesz w drugiej funkcji edytować osobę z pierwszej.
Kod: Zaznacz cały
void pobOceny()
{
STUDENT* nowe;
//nowe=new STUDENT;
nowe = Grupa[0];
- Przemekg
- Użytkownik
- Posty: 15
- Rejestracja: 27 mar 2008, o 19:48
- Płeć: Mężczyzna
- Lokalizacja: Kamienna Góra
- Podziękował: 1 raz
C++ do struktury przypisują się niechciane wartości
Ten kod który podałeś rozwiązał sprawę. Właśnie o to mi chodziło, dzięki.
C++ do struktury przypisują się niechciane wartości
Ojoj, kolega ma troche bledow.
Zapomniales o dodatkowym znaku '\0', czyli zakonczenie stringa. Powieksz tablice lub zmniejsz liczbe zapisywanych znakow przez strumien.
Nie widze potrzeby stosowania tylu new.
No i memory leak w funkcji pobOceny();. Najpierw tworzysz nowy obiekt w pobDane(); zapsiujac jego adres w globalnej zmiennej Grupa. Pozniej w pobOceny() adres jest nadpisywany przez kolejna zmienna tworzona w tej funkcji - stad Twoj blad z wyswietlaniem imienia...
Stanowczo radze Ci poczytac o zmiennych lokalnych, ich zakresie, stosie funkcji i tworzeniu nowych obiektow.
Kod: Zaznacz cały
char imie[25];
...
cout<<"Podaj imie: ";
cin.getline(nowy->imie,25);
Nie widze potrzeby stosowania tylu new.
No i memory leak w funkcji pobOceny();. Najpierw tworzysz nowy obiekt w pobDane(); zapsiujac jego adres w globalnej zmiennej Grupa. Pozniej w pobOceny() adres jest nadpisywany przez kolejna zmienna tworzona w tej funkcji - stad Twoj blad z wyswietlaniem imienia...
Stanowczo radze Ci poczytac o zmiennych lokalnych, ich zakresie, stosie funkcji i tworzeniu nowych obiektow.