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

jak czytać dokumentacje?

Object Storage Arubacloud
+2 głosów
1,166 wizyt
pytanie zadane 23 lipca 2018 w C i C++ przez jugan Nowicjusz (240 p.)
To mój pierwszy post na forum także witam wszystkich serdecznie ;) Będzie to pytanie z typu " jestem nowy i nie wiem oczywistej rzeczy". Podczas sprawdzania dokumentacji funkcji z biblioteki dirent.h natrafiłem na linię

DIR *opendir(const char * name)

Na wikipedii znalazłem informację, że DIR to  struktura reprezentująca strumień katalogowy

Dodałem więc do swojego programu stosowne biblioteki i próbuję napisać:

DIR proba;

I błąd kompilacji. Jeżeli zrobię DIR * proba to będzie ok. Gdy tworzę własną strukturę to mam możliwość zdefiniowania zarówno zmiennej tego typu strukturalnego jak i wskaźnika na nią. Dlaczego tutaj nie mam takiej możliwości?
2
komentarz 23 lipca 2018 przez monika90 Pasjonat (22,940 p.)
A nie przyszło ci do głowy żeby podać komunikat błędu, oraz jakiego języka i jakiego kompilatora używasz?
komentarz 23 lipca 2018 przez jugan Nowicjusz (240 p.)
Przepraszam. Myślałem, że jest to jakaś znana wszystkim funkcja i problem ;)

Język - c++ , chociaż funkcja pochodzi z języka C

Kompilator - g++ ( pracuję na linuxie )

Błąd:

error: aggregate ‘DIR zmienna’ has incomplete type and cannot be defined

1 odpowiedź

+1 głos
odpowiedź 23 lipca 2018 przez monika90 Pasjonat (22,940 p.)
Pewnie w używanej prze Cię implementacji DIR jest typem niekompletnym, to znaczy że definicja struktury jest ukryta, a kompilatorowi znana jest tylko nazwa. To pozwala Ci na tworzenie wskaźników i referencji ale nie obiektów. Nie ma potrzeby tworzenia przez ciebie obiektów typu DIR podczas korzystania z funkcji z <dirent.h>. Funkcja opendir ma dostęp do definicji DIR więc może go stworzyć, a Tobie zwraca tylko wskaźnik.
komentarz 23 lipca 2018 przez jugan Nowicjusz (240 p.)
Super! Dziękuję za odpowiedź. A na przyszłość to skąd mam wiedzieć, czy w danej bibliotece coś jest niekompletne?
komentarz 23 lipca 2018 przez monika90 Pasjonat (22,940 p.)
To powinno być napisane w dokumentacji. A jak nie jest napisane, to kompilator Ci powie przecież.

U mnie w mingw DIR nie jest typem niekompletnym, więc mogę tworzyć zmienne typu DIR, ale też ich tworzenie nie jest potrzebne by używać dirent.

Poza tym C++ ma bibliotekę filesystem w standardzie i jej można używać do operacji na katalogach.
komentarz 23 lipca 2018 przez jugan Nowicjusz (240 p.)
To jeszcze jedno pytanie, co do dirent.h oraz wskaźnika na strukturę.

Niekiedy widzę wskaźniki na strukturę przy których się nie rezerwuje pamięci ( jak np. tutaj ), a nieraz bez tego się nie obejdzie. Kiedy się to robi, a kiedy nie?
komentarz 23 lipca 2018 przez monika90 Pasjonat (22,940 p.)
Tutaj nie musisz rezerwować, bo funkcja opendir to robi, a funkcja closedir zwalnia zarezerwowaną pamięć.
komentarz 23 lipca 2018 przez jugan Nowicjusz (240 p.)

Mówi o tym to zdanie? 

Upon successful completion, opendir() shall return a pointer to an object of type DIR. Otherwise, a null pointer shall be returned and errno set to indicate the error.

Jest tutaj powiedziane, że zwraca wskaźnik do obiektu, ale jednak nie ma nic o alokacji pamięci

Poproszę o to zdanie, które o tym mówi ;)

komentarz 23 lipca 2018 przez monika90 Pasjonat (22,940 p.)
Jeżeli zwraca wskaźnik do obiektu to ten obiekt musi istnieć, nie może być alokowany statycznie, bo wtedy mógłbyś przeglądać tylko jeden katalog na raz.
komentarz 23 lipca 2018 przez jugan Nowicjusz (240 p.)
Mogłabyś trochę rozwinąć swoją wypowiedź? Nie za bardzo ją rozumiem. Tzn. pierwszą część ( Jeżeli zwraca wsk do obiektu to ten obiekt musi istnieć ) rozumiem. Potem już niestety nie
komentarz 23 lipca 2018 przez monika90 Pasjonat (22,940 p.)
Ta druga część miała znaczyć, że opendir używa dynamicznej alokacji dla obiektów DIR,  zamiast zwracania za każdym razem wskaźnika do tej samej zmiennej statycznej. Dzięki temu jednocześnie może istnieć wiele DIRów i można listować wiele katalogów na raz, gdyby komuś przyszła na to ochota.
komentarz 23 lipca 2018 przez jugan Nowicjusz (240 p.)
Dziękuję za pomoc ;)

Podobne pytania

+2 głosów
2 odpowiedzi 901 wizyt
+1 głos
0 odpowiedzi 184 wizyt
pytanie zadane 26 grudnia 2022 w Python przez MichaelM Bywalec (2,520 p.)
0 głosów
1 odpowiedź 202 wizyt
pytanie zadane 6 września 2017 w Sieci komputerowe, internet przez xdmik23 Gaduła (3,000 p.)

92,565 zapytań

141,416 odpowiedzi

319,598 komentarzy

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

...