operator new, static -> smieci w zmiennych

0

Witam, spójrzcie na ten kod poniżej. Chcę napisać trochę większy program, ale nie chwytam pewnych podstaw, bo nie wiem czemu ten okrojony kod niżej nie działa. Ma być stworzona mimi mini baza ze studentami, wiec tworzę po kolei nowe elementy statyczne a ich adresy wrzucam do tablicy, jednak pojawiają mi się jakieś śmieci. Problem możliwe tkwi w rodzaju/miejscu lub widoczności zmiennych... załączyłem screeny z uruchomienia
Proszę o pomoc.

#include <iostream>
using namespace std;

int a = 0;
const int ilosc = 15;

struct student
{
    char imie[25];
    int numer;
};

// tworzon sa zmienne i zwracany adres ulokowania
student * dodaj(void)
{
    static student * s = new student;
    cout << "Podaj imie: ";
    cin >> (*s).imie;
    cout << "Podaj numerek: ";
    cin >> (*s).numer;
    cout << "\n\n";
    return(s);
}

int main()
{
    // tablica z adresami do zmiennych
    student * grupa[ilosc];
    
    for(int i = 0; i < 3; i++) // dodaje 3 studentow
    {
        grupa[i] = dodaj();
    }
    
    for(int i = 0; i < ilosc; i++)
    {
        printf("adres = %ld, imie = %s, numerek = %d\n", grupa[i], (*grupa)[i].imie, (*grupa)[i].numer);
    }
    
    for(int i = 0; i < ilosc; i++)
    {
        delete grupa[i];
    }
    
    system("PAUSE");
    return(0);
}
0

Nie chce mi sie tego wrzucać w kompilator, ale na bank gdzieś wykraczasz poza allokowaną pamięć. Może użyj std::vector
a poza tym zdecyduj sie w jakim języku piszesz... i w ogóle śmierć ku1as i zniszczenie w tym kodzie...

0

A konkretniej w pętli wypisującej i usuwającej obiekty. Tworzysz tylko 3, a chcesz usunąć, wypisać 15. Do tego ten static w funkcji tworzącej nowe obiekty to zły pomysł.

0

Tak, tam był ten błąd, ale dalej coś mi nie gra:

#include <iostream>

using namespace std;

int a = 0;
const int ilosc = 3;

struct student
{
    char imie[25];
    int numer;
};

// tworzon sa zmienne i zwracany adres ulokowania
student * dodaj(void)
{
    student * s = new student;
    cout << "Podaj imie: ";
    cin >> (*s).imie;
    cout << "Podaj numerek: ";
    cin >> (*s).numer;
    cout << "\n\n";
    return(s);
}

int main()
{
    // tablica z adresami do zmiennych
    student * grupa[ilosc];
    
    for(int i = 0; i < ilosc; i++) // dodaje 3 studentow
    {
        grupa[i] = dodaj();
    }
    
    for(int i = 0; i < ilosc; i++)
    {
        printf("adres = %ld, imie = %s, numerek = %d\n", grupa[i], (*grupa)[i].imie, (*grupa)[i].numer);
    }
    
    for(int i = 0; i < ilosc; i++)
    {
        delete grupa[i];
    }
    
    system("PAUSE");
    return(0);
}
 
1

(*grupa)[i]

Masz wskaźnik na tablicę czy tablicę wskaźników? Bo korzystasz jakbyś miał wskaźnik na tablicę. Polecam czytać ostrzeżenia kompilatora.

Btw zamiast (*ptr).x można korzystać z ptr->x, co by załatwiło sprawę już na samym początku.

1

Po co Ci jakiekolwiek tworzenie czegokolwiek dynamicznie, jeżeli ograniczasz to stałą?? To tak jakbyś miał Porsche i wstawił tam ogranicznik do 30km/h.
Równie dobrze, możesz napisać Student grupa[3]; a nawet będzie to lepsze, bo w oczy nie będzie kuło..

0

a jeszcze lepiej użyć std::vector, będzie dynamicznie, a wygląda jak statycznie.

0

Dzięki.
Dopiero uczymy się podstaw, więc chciałbym to jeszcze zrobić bez std::vector, cokolwiek to jest :)

Więc tworzę tablicę struktur, których kształt mam narzucony

struct OCENA
{
    // ...
    float ocena;
};

struct STUDENT
{
    // ...
    OCENA * stopnie[Noc];
};

// ...

STUDENT grupa_studentow[Nst] = {0}; 

a później chcę dopisać pierwszą ocenę

cin >> grupa_studentow[0].stopnie[0]->ocena; 

co się kompiluje, ale zawiesza program w momencie korzystania z CIN...
grupa_studentow - tablica struktur STUDENT
grupa_studentow[0] - element tablicy = struktura, student numer 0
grupa_studentow[0].stopnie - tablica adresów na struktury OCENA
grupa_studentow[0].stopnie[0] - element tablicy = adres na konkretny adres struktury OCENA
grupa_studentow[0].stopnie[0]->ocena - liczba float

Jaki popełniam błąd?
Błąd występuje w tym miejscu, ale mogę pokazać więcej kodu...
aha, jak zmodyfikuję strukturę OCENA i dodam tam jedną zmienną float ocenka, to dopisanie oceny nie powoduje żadnego błędu, więc domyślam się, że problem tkwi w tej tablicy wskaźników.

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