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

Struktury i tablice oraz crash

Object Storage Arubacloud
0 głosów
313 wizyt
pytanie zadane 25 lipca 2016 w C i C++ przez itcloud Gaduła (3,380 p.)

Czytam i czytam i próbuję od czasu do czasu dla przećwiczenia komórek wpisać sobie jakiś kod. Dzisiaj przyszedł czas na struktury (przypomina mi to ubogie klasy z samymi składnikami, bez metod) oraz tablice przekazywane do funkcji.

#include <iostream>

using namespace std;

//definicja struktury
struct Piesek{

    string imie;
};

void view_Piesek(Piesek p){
    p.imie = "Burek z funkcji";
    cout << p.imie;
}

//definicja tablicy
string Psy[3];
//Psy[0] = "Burek";   //??? dlaczego tu się czepia?


int main()
{
    void view_Piesek(Piesek p);   // się crashował, bo przy deklaracji miałem string jako typ
    Piesek pies1 = Piesek();
    pies1.imie = "Burek";
    view_Piesek(pies1);


}

Pytania:

1. Program się crashuje - jak zacząłem kombinować w funkcji view_piesek. Dlaczego? edit: już wiem - przy deklaracji funkcji miałem inny typ. Ale nie wiem, dlaczego typem nie może być struktura.

Na początku miałem tę funkcję przedstawioną jako zwracającą typ struktury, czyli Piesek. Cały czas kompilator sypał błędem. Więc zmieniłem intuicyjnie na 'string' i w return zwracałem faktycznie nazwę psa. Dlaczego nie mógł pozostać typ 'Piesek' ?

2. Zauważyłem, że przekazując strukturę do funkcji jako argument - operuję na kopii. Na rozwiązanie tego potrzebowałbym wskaźnika na strukturę? A przy tablicach, czy nie jest tak - ale nie chciałem rozbudowywać kodu, póki program się crashuje - że od razu jej pierwszy element jest wskaźnikiem i przekazując nazwę tablicy tak naprawdę do funkcji przekazuję wskaźnik do niej?

komentarz 25 lipca 2016 przez Macek Kolo Mądrala (5,480 p.)
w c++ w strukturze mogą być funkcje. Klasy od struktur różnią się tym, że w pierwszych wszystkie pola domyślnie są prywatne, a w drugich publiczne.
komentarz 25 lipca 2016 przez smh Obywatel (1,940 p.)

Właściwie, struktury i unie to klasy. Tak samo, jak przy polach, domyślne dziedziczenie klas class jest prywatne, a klas struct – publiczne.

3 odpowiedzi

+2 głosów
odpowiedź 25 lipca 2016 przez draghan VIP (106,230 p.)

Struktury w C++ różnią się od klas tylko jednym szczegółem - domyślnym specyfikatorem dostępu, który w strukturach jest domyślnie public, zaś w klasach - private.

przy deklaracji funkcji miałem inny typ. Ale nie wiem, dlaczego typem nie może być struktura (...)
Na początku miałem tę funkcję przedstawioną jako zwracającą typ struktury, czyli Piesek. Cały czas kompilator sypał błędem. 

Może być struktura, jeśli tylko wcześniej została zadeklarowana. Jeśli pokażesz komunikat błędu, to znajdziemy przyczynę.

Zauważyłem, że przekazując strukturę do funkcji jako argument - operuję na kopii. Na rozwiązanie tego potrzebowałbym wskaźnika na strukturę?

Tak. Lub lepiej - referencję.

A przy tablicach, czy nie jest tak - ale nie chciałem rozbudowywać kodu, póki program się crashuje - że od razu jej pierwszy element jest wskaźnikiem i przekazując nazwę tablicy tak naprawdę do funkcji przekazuję wskaźnik do niej?

Dokładnie tak jest.

A teraz spójrz na to i odpowiedz mi na postawione tu pytania.

#include <iostream>

using namespace std;

//definicja struktury
struct Piesek{

    string imie;
};

void view_Piesek(Piesek p){
    p.imie = "Burek z funkcji";
    cout << p.imie;
}

//definicja tablicy
string Psy[3];

/// Instrukcje nie mogą "wisieć" w przestrzeni globalnej - musisz je umieścić w ciele funkcji
//Psy[0] = "Burek";   //??? dlaczego tu się czepia?


int main()
{
    /// co to poniżej i dlaczego to tu jest?
    void view_Piesek(Piesek p);   // się crashował, bo przy deklaracji miałem string jako typ

    /// Przypominam, że nie zdefiniowałeś konstruktora i jest użyty domyślny.
    Piesek pies1 = Piesek();

    pies1.imie = "Burek";
    view_Piesek(pies1);
}
komentarz 25 lipca 2016 przez itcloud Gaduła (3,380 p.)

Poprawiłem nieco kod:

#include <iostream>
using namespace std;

//definicja struktury
struct Piesek{

    string imie;
};

Piesek view_Piesek(Piesek p){
    p.imie = "Burek z funkcji";
    return p;
}

int main()
{
    //deklaracja funkcji
    Piesek view_Piesek(Piesek p);

    //utworzenie zmiennej strukturalnej pies1
    Piesek pies1 = Piesek();
    pies1.imie = "Burek";

    //cout << view_Piesek(pies1);   //dlaczego ten cout nie działa?

    //definicja tablicy
    string Psy[3];
    Psy[0] = "Bureczek z tablicy";
    Psy[1] = "Sonik z tablicy";
    Psy[2] = "Monia z tablicy";
    for(int a=0;a<3;a++){
        cout << Psy[a];
    }

}

A odnośnie Twoich pytań, to:

 void view_Piesek(Piesek p);

To miała być deklaracja funkcji, zanim jej użyję w kodzie dalej. Co to znaczy "deklaracja struktury", nie wystarczy to co mam w kodzie powyżej?

komentarz 25 lipca 2016 przez draghan VIP (106,230 p.)
Ale przecież nie musisz deklarować osobno tej funkcji, skoro masz ją zdefiniowaną chwilę przed, w tej samej jednostce translacji.

Deklaracja struktury to to samo, co deklaracja funkcji - tyle że dla struktury. ;) I również odpowiedź jest taka sama, jak wyżej - jeśli masz w danej jednostce translacji definicję struktury, to nie musisz jej ponownie deklarować - bo definicja jest sama w sobie deklaracją.

Niech mnie ktoś poprawi, bo mogę się tu mylić: nie widziałem jeszcze deklaracji funkcji w bloku kodu - czy to nie jest niepoprawne?
komentarz 25 lipca 2016 przez itcloud Gaduła (3,380 p.)
Aha, czyli deklaruję wtedy gdy.. ?
+1 głos
odpowiedź 25 lipca 2016 przez Macek Kolo Mądrala (5,480 p.)
ad1. jeśli dobrze myślę, to dlatego że string jest niemutowalny. Czyli idąc za pojęciem hermetyzacji z OOP musisz używać getterów i setterów by ustawić/dostać się do obiektu

ad2. No tak, jak przekazujemy tablice to tak naprawdę dajemy wskaźnik na pierwszy jej element, ale nie wiem co to ma wspólnego z strukturą?
0 głosów
odpowiedź 25 lipca 2016 przez Patrycjerz Mędrzec (192,320 p.)
Jak ty człowieku wywołujesz funkcję? Dlaczego piszesz polecenia poza funkcjami? Polecam obejrzeć kolejny raz jakikolwiek kurs języka, bo bez podstaw ani rusz.
komentarz 25 lipca 2016 przez itcloud Gaduła (3,380 p.)
void view_Piesek(Piesek p);   // tak deklaruję funkcję

    view_Piesek(pies1);  //a tu ją używam - nie przypisuje do zmiennej wyniku, bo od razu w funkcji o typie void wyświetlam tekst w jej wnętrzu

Podobne pytania

0 głosów
0 odpowiedzi 338 wizyt
pytanie zadane 5 maja 2020 w C i C++ przez Atman Użytkownik (810 p.)
0 głosów
1 odpowiedź 196 wizyt
pytanie zadane 6 listopada 2016 w C i C++ przez marcin8352 Nowicjusz (230 p.)
0 głosów
2 odpowiedzi 455 wizyt
pytanie zadane 11 września 2020 w C i C++ przez Kytrap Początkujący (390 p.)

92,690 zapytań

141,603 odpowiedzi

320,098 komentarzy

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

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!

...