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

question-closed Adres struktury w wartości funkcji

Object Storage Arubacloud
0 głosów
542 wizyt
pytanie zadane 22 maja 2017 w C i C++ przez Kamil Paradowski Użytkownik (620 p.)
zamknięte 23 maja 2017 przez Kamil Paradowski

Witam mam pytanie. Robię zadanie o następującej 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.

c) Napisz prosty program używający powyższych dwóch funkcji

Napisałem coś takiego: 

#include <iostream>

void a (struct pudlo c);
long double b (struct pudlo& c);

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

int main()
{
    pudlo c
    {
        "Space Soldiers",
        11.37,
        13.37,
        86.85,
        2017.07
    };
    a(c);
    std::cout<<"\nNowa objetosc jest = "<<b(c)<<std::endl;
    return 0;
}

void a(struct pudlo c)
{
    std::cout<<"Producent to: "<<c.producent<<std::endl;
    std::cout<<"Wysokosc jest = "<<c.wysokosc<<std::endl;
    std::cout<<"Szerokosc jest = "<<c.szerokosc<<std::endl;
    std::cout<<"Dlugosc jest = "<<c.dlugosc<<std::endl;
    std::cout<<"Objetosc jest = "<<c.objetosc<<std::endl;
}
long double b(struct pudlo& c)
{
    return (c.objetosc=c.wysokosc*c.szerokosc*c.dlugosc);
}

Nie jestem pewny czy prawidłowo przekazałem adres struktury do wartości funkcji b... Za łatwo mi to poszło i to jest podejrzane. Czy w taki sposób jak to zrobiłem w tym kodzie jest możliwe przekazanie adresu do wartości funkcji?

komentarz zamknięcia: Otrzymałem odpowiedź

1 odpowiedź

+1 głos
odpowiedź 22 maja 2017 przez Dexterim Dyskutant (8,370 p.)
Wydaje mi się, że wszystko jest w porządku poza jedną uwagą, że do funkcji b przekazujesz parametr przez referencje a nie przez adres.

Zastanawiam się też nad sensownością pisania struct w parametrach funkcji.

Dodatkowo przyjrzyj się czy jesteś pewny co zwracasz w funkcji b.
komentarz 22 maja 2017 przez Kamil Paradowski Użytkownik (620 p.)
Wiesz może jak w takim razie powinienem napisać kod, żebym mógł przekazać parametr przez adres? I tak masz rację, nie potrzebnie napisałem "struct" w parametrach, na początku dopisałem, bo coś mi nie działało, kiedy nie dopisywałem :)
komentarz 22 maja 2017 przez Dexterim Dyskutant (8,370 p.)

Na przykład:

void fun(int* zmienna);

int main(){
 int zm1;
fun(&zm1);
}

to powinno jakoś tak wyglądać. Deklarujesz w funkcji zmienna typu wskaźnikowego

komentarz 22 maja 2017 przez Kamil Paradowski Użytkownik (620 p.)
#include <iostream>

void a (struct pudlo c);
long double b (struct pudlo * c);

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

int main()
{
    pudlo c
    {
        "Space Soldiers",
        21.37,
        13.37,
        86.85,
        2017.07
    };
    a(c);
    std::cout<<"\nNowa objetosc jest = "<<b(&c)<<std::endl;
    return 0;
}

void a(pudlo c)
{
    std::cout<<"Producent to: "<<c.producent<<std::endl;
    std::cout<<"Wysokosc jest = "<<c.wysokosc<<std::endl;
    std::cout<<"Szerokosc jest = "<<c.szerokosc<<std::endl;
    std::cout<<"Dlugosc jest = "<<c.dlugosc<<std::endl;
    std::cout<<"Objetosc jest = "<<c.objetosc<<std::endl;
}
long double b(pudlo & c)
{
    return (c->objetosc=c->wysokosc*c->szerokosc*c->dlugosc);
}

Coś takiego? Teraz jednak mam błąd z ostatnim wierszem, a mianowicie: 

"error: base operand of '->' has non-pointer type 'pudlo'|"

komentarz 22 maja 2017 przez Dexterim Dyskutant (8,370 p.)
Masz dwa różne typy w funkcji b w prototypie jak i definicji
komentarz 22 maja 2017 przez Kamil Paradowski Użytkownik (620 p.)
To jak powinienem to zrobić, skoro ma być odniesienie do wskaźnika w prototype funkcji b?
komentarz 23 maja 2017 przez Dexterim Dyskutant (8,370 p.)

Nie możesz mieć różnicy w parametrach w definicji i prototypie.

Proponuje taką wersje:

#include <iostream>

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

void a ( pudlo c);
long double b ( pudlo * c);
 

 
int main()
{
    pudlo c
    {
        "Space Soldiers",
        21.37,
        13.37,
        86.85,
        2017.07
    };
    a(c);
    std::cout<<"\nNowa objetosc jest = "<<b(&c)<<std::endl;
    return 0;
}
 
void a(pudlo c)
{
    std::cout<<"Producent to: "<<c.producent<<std::endl;
    std::cout<<"Wysokosc jest = "<<c.wysokosc<<std::endl;
    std::cout<<"Szerokosc jest = "<<c.szerokosc<<std::endl;
    std::cout<<"Dlugosc jest = "<<c.dlugosc<<std::endl;
    std::cout<<"Objetosc jest = "<<c.objetosc<<std::endl;
}
long double b(pudlo * c)
{
    return (c->objetosc=c->wysokosc*c->szerokosc*c->dlugosc);
}

 

komentarz 23 maja 2017 przez Kamil Paradowski Użytkownik (620 p.)

I taki kod przekazuje dalej adres struktury, bo jak rozumiem: 

std::cout<<"\nNowa objetosc jest = "<<b(&c)<<std::endl;

Ten wiersz kodu jest za to tutaj odpowiedzialny?

komentarz 23 maja 2017 przez Dexterim Dyskutant (8,370 p.)
Dokładnie to &c jest adresem zmiennej c którą przekazujemy później do funkcji
komentarz 23 maja 2017 przez Kamil Paradowski Użytkownik (620 p.)
Dziękuje za pomoc, przyczyniłeś się do utrwalenia mojej wiedzy z C++ na przyszłość :)

Dobranoc!

Podobne pytania

0 głosów
2 odpowiedzi 516 wizyt
pytanie zadane 4 stycznia 2017 w C i C++ przez Ala123456 Użytkownik (760 p.)
0 głosów
1 odpowiedź 412 wizyt
0 głosów
2 odpowiedzi 7,792 wizyt
pytanie zadane 28 czerwca 2017 w C i C++ przez Arson90 Nowicjusz (180 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 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!

...