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

Przekazywanie i zwracanie struktur c++

VPS Starter Arubacloud
+1 głos
2,441 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ź 572 wizyt
pytanie zadane 2 czerwca 2017 w C i C++ przez mibdbz Gaduła (4,300 p.)
0 głosów
1 odpowiedź 842 wizyt
pytanie zadane 3 czerwca 2017 w C i C++ przez J0ker Pasjonat (15,400 p.)
0 głosów
1 odpowiedź 153 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...