• 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

VPS Starter Arubacloud
0 głosów
691 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 559 wizyt
pytanie zadane 4 stycznia 2017 w C i C++ przez Ala123456 Użytkownik (760 p.)
0 głosów
1 odpowiedź 439 wizyt
0 głosów
2 odpowiedzi 7,932 wizyt
pytanie zadane 28 czerwca 2017 w C i C++ przez Arson90 Nowicjusz (180 p.)

93,023 zapytań

141,986 odpowiedzi

321,290 komentarzy

62,370 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...