C++ do struktury przypisują się niechciane wartości

Awatar użytkownika
Przemekg
Użytkownik
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

Post autor: Przemekg »

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.
Awatar użytkownika
wafello
Użytkownik
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

Post autor: wafello »

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.

Kod: Zaznacz cały

void pobOceny()
{
STUDENT* nowe;
//nowe=new STUDENT;
nowe = Grupa[0];
Ale to tylko moje domysły....
Awatar użytkownika
Przemekg
Użytkownik
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

Post autor: Przemekg »

Ten kod który podałeś rozwiązał sprawę. Właśnie o to mi chodziło, dzięki.
f1x
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 13 sty 2009, o 16:26

C++ do struktury przypisują się niechciane wartości

Post autor: f1x »

Ojoj, kolega ma troche bledow.

Kod: Zaznacz cały

char imie[25];
...
cout<<"Podaj imie: ";
cin.getline(nowy->imie,25);
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.
ODPOWIEDZ