losowanie –funkcja: - pobiera jako argument liczbę N struktur, które mają zostać utworzone; - dynamicznie alokuje pamięć na tablicę N wskaźników na struktury; - następnie alokuje kolejno N struktur, przypisując uzyskane adresy do kolejnych komórek utworzonej wcześniej tablicy; Jest ktoś w stanie jakoś po ludzku wytłumaczyć mi o so w tym chosi? Nie chcę tu gotowego kodu, ale chociaż wytłumaczenia zasady działania i podania ewentualnych dodatkowych źródeł. Jesteście moją ostatnią deską ratunku. Uratujcie biednego studenta... #naukaprogramowania
@alfabeta11: funkcja na przyjąć inta N, utworzyć (zaalokować) tablicę o wielkości N pointerów na struktury, a następnie utworzyć N struktur i wypełnić wcześniej utworzoną tablicę pointerami na utworzone struktury. Czyli bardziej metaforycznie - weź N, zrób listę N adresów (na razie pusta książka adresowa), potem wybuduj N domów i wypełnij książkę adresami tych domów :)
@alfabeta11: jeśli coś C-podobne to chodzi o to, żeby zrobić
???? funkcja(int N) { /* tu kod */ } Która tworzy dynamiczną tablicę N-elementową, której elementami są wskaźniki na jakiś typ struktur. Następnie każdy element tablicy ma być wypełniony dynamicznie stworzoną (każda różną) strukturą.
Ot coś w stylu
typ_struktury** tablica = new typ_struktury*[N]; for(...) { tablica[i] = new typ_struktury(); }
@kao3991: Czyli coś w stylu, że na żywca tworzę sobie tablicę struktur za pomocą tego nieszczęsnego malloc, potem kiedy mam już np structtab[i], mam zrobić coś w stylu structtab[i] = malloc i znowu alokowac rozmiar sturktury? Wszystko to na pojedynczym "*"?
@alfabeta11: * oznacza wskaźnik (pointer), ** to wskaźnik na wskaźnik (pointer to pointer). Pogoogluj jeżeli nadal nie jest to jasne, jest dużo tłumaczeń z obrazkami
@alfabeta11: krótko mówiąc, wskaźnik przechowuje adres pod jakim znajduje się pewna zmienna/obiekt, wskaźnik na wskaźnik przechowuje adres, pod którym znajdziemy wskaźnik na zmienną/obiekt
@alfabeta11: Przydaje się, jeżeli np. z jakichś powodów chcesz w funkcji manipulować wartością wskaźnika (adresem jaki przechowuje), wtedy przekazujesz adres tego wskaźnika, czyli wskaźnik na wskaźnik
@nieztejziemi: kolejne pytanie (przepraszam, że tak truję, ale fajnie jest wiedzieć trochę więcej). Samego adresu nie można by przechowywać w jakiejś zmiennej typu string czy coś w ten deseń?
Samego adresu nie można by przechowywać w jakiejś zmiennej typu string czy coś w ten deseń?
@alfabeta11: Byłoby to karkołomne ( ͡°͜ʖ͡°) Po 1. po to są wskaźniki, aby trzymać w nich adres. Język udostępnia narzędzia manipulacji na wskaźnikach (takie jak właśnie typy wskaźnikowe, operatory dereferencji wskaźników etc). Poza tym taki wskaźnik ma stały rozmiar i przechowuje się w nim wartość liczbowa. Jakbyś chciał trzymać
I pojawia się kolejne pytanie, po co wskazywać na wskaźnik?
Samego adresu nie można by przechowywać w jakiejś zmiennej typu string czy coś w ten deseń?
@alfabeta11: W C stringi to tablice znaków, a w czymś takim jak tablica[n] tablica jest wskaźnikiem na pierwszy element. W związku z tym często spotyka się zapis char** argv, co należy rozumieć jako tablica stringów.
@nieztejziemi: @NostalgicznyPasterz: Bardzo wam dziękuję za dosyć obszerne wyjaśnienia. Prawie wszystkie moje wątpliwości chyba zostały rozwiane. Mówię chyba, bo temat wskaźników sam w sobie jest dosyć straszny ;)
Zostaje tylko jedna sprawa. Kedy robię malloc([...] sizeof(struct type*)) to alokuje się ilość pamięci o rozmiarze samego adresu, czy raczej o rozmiarze całej struktury?
@alfabeta11: malloc(a) zaalokuje a bajtów pamięci. sizeof(typ) zwróci liczbę bajtów zajmowana przez przekazany typ, dlatego sizeof(struct type\*) zwróci rozmiar struct type\*, który jest wskaźnikiem (czyli pewnie jakieś 4).
@alfabeta11: Napisałem Ci mały przykład: https://ideone.com/8dWv6L 1) rozmiar struktury to 20 bajtow (zalezny od zawartosci struktury) 2) rozmiar wskaznika na strukture to 4 bajty (rozmiar staly, niezaleznie od typu ktory przechowuje - w koncu adres to adres, niezaleznie na co wskazuje) 3) powolalismy tablice struktur, tablica jest reprezentowana jako adres pierwszego elementu. Poniewaz jest to adres, to sizeof zwraca 4 bajty. Zostal zaalokowany blok 200 bajtow na 10 struktur tt. 4)
losowanie –funkcja:- pobiera jako argument liczbę N struktur, które mają zostać utworzone;
- dynamicznie alokuje pamięć na tablicę N wskaźników na struktury;
- następnie alokuje kolejno N struktur, przypisując uzyskane adresy do kolejnych komórek utworzonej wcześniej tablicy;
Jest ktoś w stanie jakoś po ludzku wytłumaczyć mi o so w tym chosi? Nie chcę tu gotowego kodu, ale chociaż wytłumaczenia zasady działania i podania ewentualnych dodatkowych źródeł. Jesteście moją ostatnią deską ratunku. Uratujcie biednego studenta...
#naukaprogramowania
Czyli bardziej metaforycznie - weź N, zrób listę N adresów (na razie pusta książka adresowa), potem wybuduj N domów i wypełnij książkę adresami tych domów :)
???? funkcja(int N) { /* tu kod */ }Która tworzy dynamiczną tablicę N-elementową, której elementami są wskaźniki na jakiś typ struktur. Następnie każdy element tablicy ma być wypełniony dynamicznie stworzoną (każda różną) strukturą.
Ot coś w stylu
typ_struktury** tablica = new typ_struktury*[N];for(...) { tablica[i] = new typ_struktury(); }
Wszystko to na pojedynczym "*"?
new ...namalloc(...).+ pytanie za 10 pkt, czym się różni * od **? Bo nie doszukałem się nigdzie niczego sensownego.
@alfabeta11: Tworzysz tablicę wskaźników na struktury
@alfabeta11: Byłoby to karkołomne ( ͡° ͜ʖ ͡°) Po 1. po to są wskaźniki, aby trzymać w nich adres. Język udostępnia narzędzia manipulacji na wskaźnikach (takie jak właśnie typy wskaźnikowe, operatory dereferencji wskaźników etc). Poza tym taki wskaźnik ma stały rozmiar i przechowuje się w nim wartość liczbowa. Jakbyś chciał trzymać
@alfabeta11:
W C stringi to tablice znaków, a w czymś takim jak tablica[n] tablica jest wskaźnikiem na pierwszy element. W związku z tym często spotyka się zapis char** argv, co należy rozumieć jako tablica stringów.
Zostaje tylko jedna sprawa. Kedy robię malloc([...] sizeof(struct type*)) to alokuje się ilość pamięci o rozmiarze samego adresu, czy raczej o rozmiarze całej struktury?
malloc(a) zaalokuje a bajtów pamięci. sizeof(typ) zwróci liczbę bajtów zajmowana przez przekazany typ, dlatego sizeof(struct type\*) zwróci rozmiar struct type\*, który jest wskaźnikiem (czyli pewnie jakieś 4).
@NostalgicznyPasterz, @nieztejziemi, @CoJaCzytam, @kao3991 Dziękuję wam wszystkim, Panowie za chęć niesienia pomocy i edukowania niewyedukowanych.
1) rozmiar struktury to 20 bajtow (zalezny od zawartosci struktury)
2) rozmiar wskaznika na strukture to 4 bajty (rozmiar staly, niezaleznie od typu ktory przechowuje - w koncu adres to adres, niezaleznie na co wskazuje)
3) powolalismy tablice struktur, tablica jest reprezentowana jako adres pierwszego elementu. Poniewaz jest to adres, to sizeof zwraca 4 bajty. Zostal zaalokowany blok 200 bajtow na 10 struktur tt.
4)
Dla uzupelnienia, dla tablic alokowanych nie-dynamicznie sizeof zwraca rozmiar całej struktury.