Dynamiczna tablica struktur

Odpowiedz Nowy wątek
2017-09-24 14:44
0

Cześć wszystkim!

Ostatnio czytałem trochę o strukturach i wskaźnikach, podjałem się napisania prostego programu zawierającego dynamiczną tablicę struktur i powstało coś takiego
Fragment kodu:


struct Batonik{
 string nazwa;
 double waga;
 int kalorie;
 };

 Batonik * wsk = new Batonik[2];
for (int i = 0; i<2; i++){
  cout<<"Podaj nazwe batonika: ";
  getline(cin, wsk[i].nazwa);
  cout<<"Podaj wage batonika: ";
  (cin>>wsk[i].waga).get();
  cout<<"Podaj liczbe kalorii: ";
  (cin>>wsk[i].kalorie).get();
  cout<<endl;
}

Chciałbym jakoś poukładać sobie wiedzę na ten temat ale do tego muszę rozwiać swoje wątpliwości.

  1. Czy przedstawiony wyżej fragment kodu można w ogóle nazwać DYNAMICZNĄ tablicą strutkur? Jeśli nie to, gdzie popełniłem błąd?
  2. W książce, którą aktualnie przerabiam związaną z C++ napisane jest, że sięganie do pól(wskaźników) odbywa się za pomocą operatora -> i błędem jest użycie operatora kropki (jak przy normalnych strukturach). W moim kodzie w przypadku użycia operatora -> program nawet się nie kompiluje - działą tylko i wyłącznie z operatorem kropki - czemu?
  3. (chyba najgłupsze pytanie) Czy jeśli najpierw w miejscu wsk[0].waga zapisze wartosc powiedzmy 100, to po zwolnieniu pamieci (delete [] wsk;) odwolani wsk[0].waga nadal powinno wyswietlac wartość 100 zamiast wyrzucania błedu?
    cout<<wsk[0].waga;
    delete [] wsk;
    cout<<endl;
    cout<<wsk[0].waga;

Z góry dziękuje za odpowiedz na moje pytania. Pozdrawiam :-)

edytowany 1x, ostatnio: furious programming, 2017-09-27 02:34

Pozostało 580 znaków

2017-09-24 16:01
3
  1. Jest to tablica dynamiczna ,więc chyba tak.
  2. Wydaje mi się, że tab[n] zwraca już obiekt, a nie adres, więc musisz używać kropki.
  3. Po usunięciu wskaźnika nie wiesz co się pod nim znajduje, więc nie możesz się odwołać do tego obszaru pamięci.

Proszę o sprostowanie bo w sumie tak to pamiętam, ale mogę się mylić.

Pozostało 580 znaków

2017-09-24 16:36
kq
4
  1. Tak, chociaż przy wielkości zapisanej na stałe wiele dynamizmu nie ma. Jeśli mówimy o wskaźnikach, to nie powinieneś ich jawnie używać: https://dsp.krzaq.cc/post/176[...]xx-kiedy-uzywac-new-i-delete/
  2. W tym przypadku tab[n] jest równoznaczne z *(tab+n). Ze strzałką mógłbyś użyć (tab+n)->waga.
  3. Dostęp po usunięciu to UB, może zdarzyć się wszystko.
  4. Po co get() na strumieniu?

Pozostało 580 znaków

2017-09-24 17:05
2

a->b to dokładnie to samo co (*a).b

W C, w C++ niekoniecznie. - hauleth 2017-09-24 17:27

Pozostało 580 znaków

2017-09-25 12:29
0

Dziękuje wszystkim za odpowiedzi :-)

kq napisał(a):
  1. Tak, chociaż przy wielkości zapisanej na stałe wiele dynamizmu nie ma. Jeśli mówimy o wskaźnikach, to nie powinieneś ich jawnie używać: https://dsp.krzaq.cc/post/176[...]xx-kiedy-uzywac-new-i-delete/
  2. W tym przypadku tab[n] jest równoznaczne z *(tab+n). Ze strzałką mógłbyś użyć (tab+n)->waga.
  3. Dostęp po usunięciu to UB, może zdarzyć się wszystko.
  4. Po co get() na strumieniu?

1​. Dzięki za podrzucenie tej strony/artykułu przyda się z pewnością dla początkującego.
3​. Czyli to ze w tym przypadku gdy po usunieciu mojej talbicy (delete [] wsk;) wartosc wyswietalna to nadal 100 to zwykly przypadek, prawda?
4​. Chyba dla "bezpieczeństwa"

edytowany 2x, ostatnio: kq, 2017-09-25 12:30
Zedytowałem, bo markdown automatycznie robi swoją numerację. - kq 2017-09-25 12:30

Pozostało 580 znaków

2017-09-25 12:32
kq
0

3​. Generalnie tak, w praktyce po prostu nie nadpisuje się zbędnie zwolnionej pamięci, a na razie nic innego w programie jej nie potrzebowało i nie nadpisało. W dłużej działającym programie zauważyłbyś, że później pod tym wskaźnikiem miałbyś "losowe" wartości.
4​. Nie widzę sensu, można śmiało wywalić.


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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