Kłopot ze zwracaniem przez funkcję NULL/nullptr

Odpowiedz Nowy wątek
2016-11-29 18:19

Rejestracja: 3 lata temu

Ostatnio: 17 godzin temu

0

Witam.
Mam pewien problem. Otóż piszę sobie program ze strukturami itd. Napisałem już prawie cały jednak mam pewien problem-ogólnie funkcja ma zwracać wskaźnik no i w pewnym specyficznym przypadku (dokładnie gdy nie znajdzie wśród danych w tablicy żadnej wartości odpowiadającej podanym przez użytkownika kryteriom) to zamiast wskaźnika do elementu ma zwracać nullptr.
Przeczytałem sobie, że nullptr odpowiada wartości odnośnika nie zawierającego odniesienia do żadnego isntiejącego obiektu. Moje pytanie brzmi... w jaki z poniższych sposobów powinien wyglądać "return": (ptr to wskaźnik)
1.

ptr=nullptr;
return ptr;

2.

return nullptr;

Jednak wsykakuje mi w obu przypadkach "nullptr was not delcared in this scope"... a wydawało mi się, że mój kompilator obsługuje standard C++11 :/ Może zamienić na NULL (wtedy nie mam errora ale program po odpaleniu się zawiesza???)

w f. main mam:

Couple*p=bestClient(cpls,4,BGZ);

Couple to pewien zdefiniowany typ zmiennych...a bestClient to właśnie ta funkcja, która napisałem.... Może powinienem w main dać jakiegoś "ifa" który wyświetli komunikat w zależności od wartości tego wskaźnika (wtedy program mi się nie zawiesza ale tego nie ma w poleceniu do zadania, jakie otrzymałem). ;/
Dzięki za wszystkie przydatne i miłe podpowiedzi!!!

Pozostało 580 znaków

2016-11-29 18:33

Rejestracja: 6 lat temu

Ostatnio: 8 miesięcy temu

2

Oczywiście, że można zwrócić sam nullptr. Nie ma przeciw temu żadnych przeszkód. Jeżeli w jakiejś Twojej tablicy nie została znaleziona struktura danych, którą szukasz to zwyczajnie zwracasz nullptr. To normalne.

Można wielorako to zrobić np:

// Pseudokod
// 1.
return (ptr) ? ptr : nullptr;

// 2.
if (ptr) return ptr;
return nullptr;

Warto przed rozpoczęciem wyszukiwania ustawić wskaźnik na nullptr, żeby nie było w nim śmieci. Wtedy te warunki zdziałają.

edytowany 2x, ostatnio: grzesiek51114, 2016-11-29 18:36

Pozostało 580 znaków

2016-11-29 18:38

Rejestracja: 3 lata temu

Ostatnio: 17 godzin temu

1

tzn wystarczy np zainicjować ten mój wskaźnik tym nullptr??? np.

ptr=nullptr;

Pozostało 580 znaków

2016-11-29 18:39

Rejestracja: 6 lat temu

Ostatnio: 8 miesięcy temu

1

Dokładnie. Wtedy wyszukiwanie zakończone niepowodzeniem pozostawi ten wskaźnik jako nullptr i będzie można ładnie zrobić if'y.

Pozostało 580 znaków

2016-11-29 18:42

Rejestracja: 3 lata temu

Ostatnio: 17 godzin temu

0

Dzięki... wszystko mi się niby zgadza z tym co czytałem i z tym co mówisz jednak... nadal wyskakuje mi ten "error" w przypadku nullptr... a w poleceniu mam nullptr i wolałbym jego użyć....Pracuję w Code Blocks... próbowałem coś szukać i przestawiać w opcjach żeby było zgodnie ze standardem C++11 ale nie wiem czy dobrze zaznaczyłem... ;/ Jak to ustawić? :(

edytowany 1x, ostatnio: Chungu, 2016-11-29 18:42
2016-11-29 18:49

Rejestracja: 6 lat temu

Ostatnio: 8 miesięcy temu

Code Blocksa w ogóle nie znam, bo używam QtCreatora do C/C++ ale może to Ci pomoże: http://stackoverflow.com/ques[...]upport-to-codeblocks-compiler

i jeszcze zgarnal plusa :< - Craith 2016-11-29 20:55
@Craith trza było posta pisać, a nie go komentować ;-) - grzesiek51114 2016-11-29 20:57

Pozostało 580 znaków

2016-11-29 18:53

Rejestracja: 3 lata temu

Ostatnio: 17 godzin temu

0

Dobra, super!!! Dzięki wielkie!!! Patrzyłem co prawda w google i też to znalazłem ale oprócz tego musiałem wyłączyć jeszcze jedną opcje w "flags" w każdym razie-dzięki za wszystko!!! :D

Pozostało 580 znaków

2016-11-29 19:20
Moderator

Rejestracja: 16 lat temu

Ostatnio: 1 minuta temu

1

A ja bym jednak sugerował nie zwracać nulla nigdy, bo to bardzo zła praktyka. Znacznie lepiej użyć jakiegoś Optional (nawet jeśli trzeba go sobie napisać).


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
Pokaż pozostałe 8 komentarzy
Dokładnie. Nie zapominajmy o jednej ważnej zalecie Optionali - jasno wskazują na możliwość zwrócenia nulla bez czytania implementacji/dokumentacji. Mimo to topowi programiści C++ wciąż trwają przy "narrow contract" https://www.youtube.com/watch?v=yG1OZ69H_-o - lubububu 2016-11-30 12:12
Zgadzam się. Też coś takiego widziałem, ALE - nie zwalałbym winy tylko na wskaźnik, a raczej na programistę. Pamiętajmy, że Optional nie zrobi za nas żadnej magii - jeśli puścimy *optional_value, albo optional_value-&gt;do_stuff() bez sprawdzania, to mamy UB tak jak i ze wskaźnikiem. Czy sprawi, że częściej będzie się sprawdzać jak się zobaczy "optional" czarno na białym? Może. Oby. Ale jak można nie sprawdzić zwrotnej wartości z find - czy to iterator, wskaźnik czy sama wartość szukana - to szczerze mówiąc nie rozumiem. - Xupicor 2016-11-30 12:24
@Xupicor właśnie rzecz w tym że jak masz Optional to wiesz na 100% że to może być pusta wartość i musisz sam własnoręcznie zrobić tam .get() wiedząc co robisz. Jak masz po prostu wskaźnik to nie wiesz i często nie przyjdzie ci do głowy że to może być null. Tak samo jeśli kontrakt metody się zmieni nie bardzo masz jak to zasygnalizować jak tylko zwracasz nulla ;] - Shalom 2016-11-30 12:28
Tak, albo rozpakowujesz i sprawdzasz przed użyciem albo świadomie używasz nie sprawdzając. - lubububu 2016-11-30 12:35
@Shalom nie jestem miarodajny bo raz: ostatnio więcej piszę w C niż C++, dwa: w mojej branży trzeba pisać hardkorowo defensywnie (ale w Twojej chyba też ;) ), ale generalnie operacje na gołych pointerach (o ile już się takie robi, bo to jest podstawowy problem) "się testuje na null" a iteratory "na one past end" i w ogóle nie ma tutaj dyskusji. Czytelniej byłoby zastosować w tym przypadku zastosować iterator zamiast wskaźnika, wtedy niejako automatycznie wiesz, że możesz wyjechać poza zakres. BTW, obadajcie sobie posixowego calla shmat, tam dopiero jest fajna zwrotka ;) - alagner 2016-11-30 12:44

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0