• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźnik do stringa

Object Storage Arubacloud
0 głosów
389 wizyt
pytanie zadane 27 sierpnia 2017 w C i C++ przez Virus_K Początkujący (280 p.)
edycja 27 sierpnia 2017 przez Eryk Andrzejewski

Cześć wszystkim ;)

Mam do wykonania zadanie ósme.

Napisałem taki kod:

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

int main()
{
    struct pizzas
    {
        string name;
        int diameter;
        float weight;
    };
    pizzas j;

        cout<<"Podaj nazwe firmy: ";
        cin.clear();
        getline(cin, j.name);
        cout<<"Podaj srednice pizzy: ";
        cin>>j.diameter;
        cout<<"Podaj wage pizzy: ";
        cin>>j.weight;

        cout<<"Dodano pizze! "<<endl;


        pizzas *poiter=&j;
        new (poiter) pizzas;
        cout<<endl<<poiter->name<<endl;
        cout<<poiter->diameter<<endl;
        cout<<poiter->weight<<endl;

        delete poiter;

    return 0;
}

Niestety string w przeciwieństwie do intów nie zostaje wypisany na końcu programu. Czy ktoś mógłby mi podpowiedzieć co robię źle?

Nie wiem też czy poprawnie wykonuje tę część zadania "use new to allocate a structure instead of declaring a
structure variable", ale to jedyne co mi przychodzi do głowy :)

 

Z góry dziękuję za wszelką pomoc.

komentarz 27 sierpnia 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Proszę umieszczać kod w specjalnych bloczkach.
komentarz 27 sierpnia 2017 przez Virus_K Początkujący (280 p.)
Dzięki, będę o tym pamiętał.

1 odpowiedź

+3 głosów
odpowiedź 27 sierpnia 2017 przez criss Mędrzec (172,590 p.)
wybrane 27 sierpnia 2017 przez Virus_K
 
Najlepsza
pizzas *poiter=&j;
new (poiter) pizzas;

Używasz tu placement new do utworzenia nowego obiektu dokładnie w miejscu obiektu j. Czyli faktycznie nadpisujesz obiekt którego pola wypełniałeś cin-em.

Niestety string w przeciwieństwie do intów nie zostaje wypisany na końcu programu. 

Bo został nadpisany. Na jego miejscu powstał nowy string (stworzony z konstruktorem domyślnym, a więc pusty).  Inty są poprawnie wypisywane,b o to typy podstawowe i nie mają własnego konstruktora (nadającego jakąś wartość "na start"), a klasie `pizza` też nie napisałeś żadnego konstruktora, więc pamięć w której są inty pozostaje nieruszona.

delete poiter;

Program ci się nie crashuje? Użyłeś placement new, a nie new. Tzn. nie zaalokowałeś pamięci na stercie, dlatego też nie potrzebujesz jej zwalniać. Nie możesz tak robić.

  • new - prosisz system o dodatkową pamięć dla programu i tworzysz na niej obiekt
  • placement new - podajesz konkretny adres pamięci i każesz stworzyć tam obiekt. Ofc to musi być adres pamięci należącej już do programu.

 Nie wiem też czy poprawnie wykonuje tę część zadania "use new to allocate a structure instead of declaring a  structure variable", ale to jedyne co mi przychodzi do głowy :)

 Chodziło raczej o najzwyklejsze zaalokowanie obiektu za pomocą new:

pizzas *j = new pizzas;

// cin, cin, cin

delete j;

PS:

  1. Dlaczego 'pizzas'? (dlaczego liczba mnoga?)
  2. Zdajesz się nie zauważać literówki w kodzie, dlatego wypomne :P 'pointer' zamiast 'poiter' powinno być.
komentarz 27 sierpnia 2017 przez Virus_K Początkujący (280 p.)
pizzas zostało jeszcze z zadania 7 w wersji w której  zamknąłem to wszystko w pętli i dodawałem kilka pizz :D natomiast faktycznie nie zauważyłem braku "n" w "poiter"

Brawo za spostrzegawczość ;)

Wracając do programu, nadal nie wiem jak to ugryźć
komentarz 27 sierpnia 2017 przez criss Mędrzec (172,590 p.)
Jak teraz czytam treść zadania, to nie wiem czy masz mieć możliwość dodania wielu pizz i one powinny być gdzieś zapisywane czy po prostu cały czas 'pracujemy' na aktualnie podanej...
komentarz 27 sierpnia 2017 przez Virus_K Początkujący (280 p.)
Pracujemy na aktualnie podanej, ale chciałem sobie zmodyfikować trochę program.
komentarz 27 sierpnia 2017 przez criss Mędrzec (172,590 p.)
edycja 27 sierpnia 2017 przez criss

Hm no to ten kod co wyżej podałem jest ok (ten z "// cin, cin, cin"). Napisze cały:

pizzas *p = new pizza;

std::getline(std::cin, p->name);
std::cin >> p->diameter;
std::cin >> p->weight;

std::cout << p->name << '\n' << p->diameter << '\n' << p->weight << '\n';

delete p;
komentarz 27 sierpnia 2017 przez Virus_K Początkujący (280 p.)
edycja 27 sierpnia 2017 przez Virus_K
#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

int main()
{
    struct pizzas
    {
        string name;
        int diameter;
        float weight;
    };
    pizzas j;


        cout<<"Dodano pizze! "<<endl;

        pizzas *poiter =new pizzas;
        poiter=&j;
        cout<<"Podaj nazwe firmy: ";
        cin.clear();
        getline(cin, j.name);
        cout<<"Podaj srednice pizzy: ";
        cin>>j.diameter;
        cout<<"Podaj wage pizzy: ";
        cin>>j.weight;
        //new (poiter) pizzas;
        cout<<endl<<poiter->name<<endl;
        cout<<poiter->diameter<<endl;
        cout<<poiter->weight<<endl;

        delete poiter;

    return 0;
}

Mam coś takiego. Niby działa, ale wysypuje się przy 2 i każdym kolejnym "odpaleniu".

 

Przy Twoim kodzie mam błąd

"error request for member 'name' in 'p' which is of pointer type" to samo w linijce wpisującej  diameter i weight

komentarz 27 sierpnia 2017 przez criss Mędrzec (172,590 p.)

Przy Twoim kodzie mam błąd

Sorka, edytowałem. Była kropka zamiast ->. 

Mam coś takiego. Niby działa, ale wysypuje się przy 2 i każdym kolejnym "odpaleniu".

Niepotzrebny ci obiekt j. W 20 linijce tworzysz obiekt operatorem new i nic więcej nie potrzebujesz.
Na dodatek masz wyciek pamięci - 21 linia - tracisz adres otrzymany przez new i próbujesz dealokować pamięć ze stosu programu (34 linia) - stąd crash. 

komentarz 27 sierpnia 2017 przez Virus_K Początkujący (280 p.)
Wszystko działa jak należy.

Dzięki wielkie za pomoc.

Podobne pytania

0 głosów
1 odpowiedź 264 wizyt
pytanie zadane 9 sierpnia 2018 w C i C++ przez Agnes Użytkownik (990 p.)
0 głosów
1 odpowiedź 335 wizyt
pytanie zadane 2 lipca 2022 w C i C++ przez polandonion Mądrala (7,040 p.)
0 głosów
1 odpowiedź 927 wizyt
pytanie zadane 2 listopada 2017 w C i C++ przez Kamil Duljas Użytkownik (990 p.)

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...