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

Przekazywanie i zwracanie struktur c++

+1 głos
2,860 wizyt
pytanie zadane 23 grudnia 2016 w C i C++ przez Bartosz Początkujący (310 p.)

Witam,

mam problem z rozwiazaniem zadania o treści:

Oto deklaracja pewnej struktury:

struct pudlo
{
    char producent[40];
    float wysokosc;
    float szerokosc;
    float dlugosc;
    float objetosc;
};

a) Napisz funkcję której struktura pudlo zostanie przekazana przez wartosc i ktora wyswietli wartosci wszystkich pol

b) Napisz funkcje ktorej przekazany zostanie adres struktury pudlo i ktora ustawi wartosc pola objetosc na iloczyn trzech wymiarow.

Zrobilem cos takiego:

#include <iostream>

using namespace std;

struct pudlo
{
    char producent[40];
    float wysokosc;
    float szerokosc;
    float dlugosc;
    float objetosc;
};
void pokaz_wymiary(pudlo dane);
pudlo oblicz_objetosc(pudlo wartosc_obj);
int main()
{
    pudlo informacje;
    pudlo wszystko;
    cout << "Podaj producenta, wysokosc, szerokosc, dlugosc pudla " << endl;
    while(cin >> informacje.producent >> informacje.wysokosc >> informacje.szerokosc >> informacje.dlugosc)
    {
        wszystko = oblicz_objetosc(informacje);
        pokaz_wymiary(informacje);
        cout << "Podaj dane kolejnego pudla lub nacisnij przycisk Enter" << endl;
    }
    return 0;
}
void pokaz_wymiary(pudlo dane)
{
    cout << "Otrzymane informacje o pudle to : " << endl;
    cout << "Producent: " << dane.producent << endl;
    cout << "Wysokosc pudla: " << dane.wysokosc << endl;
    cout << "Szerokosc pudla: " << dane.szerokosc << endl;
    cout << "Dlugosc pudla: " << dane.dlugosc << endl;
    cout << "Objetosc pudla: " << dane.objetosc << endl;

}
pudlo oblicz_objetosc(pudlo wartosc_obj)
{
    pudlo obj;
    obj.objetosc = (wartosc_obj.wysokosc* wartosc_obj.szerokosc * wartosc_obj.dlugosc);
    return obj;
}

Lecz dalej nie wypisuje mi obliczonej wartosci objetosci

3 odpowiedzi

0 głosów
odpowiedź 23 grudnia 2016 przez bonczeq Nowicjusz (180 p.)

Myślę, że odpowiedź twojego problemu jest zawarta w samej treści zadania:

Napisz funkcje ktorej przekazany zostanie adres struktury pudlo (...)

Ty natomiast przekazujesz kopie:

wszystko = oblicz_objetosc(informacje);

Obliczona wartość objętości co prawda jest zawarta w zmiennej wszystko, którą zwracasz, jednakże zmienną tą nie przekazujesz do funkcji pokaz_wymiar(). Do tej funkcji przekazujesz orginalną strukturę (nie zmienioną przez przez funkcje oblicz_objectosc()).

Co więcej w zmiennej wszystko jedyną zdefiniowaną wartością będzie objętość (bez wysokości, szerokości i długości).

0 głosów
odpowiedź 23 grudnia 2016 przez niezalogowany

bo robisz to źle, musisz zaalokować pamięć na heapie i zwrócić adres do struktury  (musisz też pamiętać o zwolnieniu zaaolokowanej pamięci):

struct mystruct {
  ...
};

mystruct* mystruct_create()
{
  return (mystruct*)malloc(sizeof(struct mystruct));
}

int main(void)
{
  struct mystruct* ms = mystruct_create();
  ...
  free(ms);
}
  1. https://linux.die.net/man/3/malloc
  2. https://linux.die.net/man/3/free
komentarz 23 grudnia 2016 przez niezalogowany

Edit, doczytałem polecenie i kod powinien wyglądać tak:

b) Napisz funkcje ktorej przekazany zostanie adres struktury pudlo i ktora ustawi wartosc pola objetosc na iloczyn trzech wymiarow.

void oblicz_objetosc(struct pudlo* box)
{
    box->objetosc = box->wysokosc * box->szerokosc * box->dlugosc;
}

int main()
{
  struct pudlo box;
  ...
  oblicz_objetosc(&box);
}

 

0 głosów
odpowiedź 23 grudnia 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 23 grudnia 2016 przez plkpiotr
wszystko = oblicz_objetosc(informacje);

informacja ma dotychczas cztery składowe (producent, wysokość, długość i szerokość). Przekazujemy ją jako wartość, czyli w trakcie działania funkcji działamy na kopiach wartości. Spośród trzech kopii (wysokości, długości i szerokości) obliczamy objętość i tylko ją zwracamy w reprezentancie struktury po uprzednim przypisaniu (patrz funkcja wyliczająca). Reszta kopii istnieje do momentu zakończenia funkcji. Od teraz wszystko ma przypisaną wartość objętości, bez pozostałych (bo te były widoczne tylko w czasie działania funkcji wyliczającej, gdyż nie zostały nigdzie przekazane). informacja nadal ma te same wartości, czyli bez wyliczonej objętości.

pokaz_wymiary(informacje);

Próbujesz dostać się do składowych informacji, jednak te nie uległy zmianie, nadal objętość jest nieznana.

Jak sprawić by pozostałe dane również były przekazane? Po prostu w funkcji obliczającej przekaż również dane, które możesz zwrócić i wywołaj funkcję wyświetlającą z argumentem wszystko.

pudlo oblicz_objetosc(pudlo wartosc_obj) {
    pudlo obj;
    obj.producent = wartosc_obj.producent;
    obj.wysokosc = wartosc_obj.wysokosc;
    obj.szerokosc = wartosc_obj.szerokosc;
    obj.dlugosc = wartosc_obj.dlugosc;
    obj.objetosc = (wartosc_obj.wysokosc * wartosc_obj.szerokosc * wartosc_obj.dlugosc);
    return obj;
}

Tym samym dowiedziałeś się w jaki sposób odbywa się przekazywanie przez wartość, czyli operowanie na kopiach, których modyfikacje aby były widoczne poza funkcją musimy zwrócić... Jeśli ich nie zwrócimy będą widoczne tylko do momentu działania funkcji.

Natomiast przekazywanie przez adres/referencję umożliwi nam działanie już nie na kopiach wartości, ale na oryginalnych składowych. Tego właśnie oczekują od Ciebie w podpunkcie b ; )
Powodzenia! : )

Podobne pytania

0 głosów
1 odpowiedź 797 wizyt
pytanie zadane 2 czerwca 2017 w C i C++ przez mibdbz Gaduła (4,300 p.)
0 głosów
1 odpowiedź 1,269 wizyt
pytanie zadane 3 czerwca 2017 w C i C++ przez J0ker Pasjonat (15,530 p.)
0 głosów
1 odpowiedź 259 wizyt

93,695 zapytań

142,612 odpowiedzi

323,223 komentarzy

63,225 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...