Co ludzie używają do oznaczenia, że size_t jest nieprawidłowe? -1 nie działa, a 0 może być prawidłowym rozmiarem.Niepoprawna wartość dla size_t
Odpowiedz
Być może ((size_t)-1)
?
Ściśle mówiąc, to jest prawidłowy rozmiar, ale skoro masz ten jeden nie jesteś prawdopodobnie potrzebować każdy inny ;-)
niektóre z funkcji wielobajtowych C99 robią to: zwracają '(size_t) (- 1)' lub nawet '(size_t) (- 2)' w celu oznaczenia anormalnych warunków; nie jest optymalny, ale działa w praktyce; jeśli przyczyną twojego pytania jest obsługa błędów, lepszym pomysłem może być przekazanie wskaźnika do zmiennej błędu (np. flaga błędu typu '_Bool', kod błędu typu' int' lub komunikat o błędzie typu ' const char * ') jako dodatkowy argument – Christoph
Tak, to typowy idiom. Często możesz też zobaczyć '(time_t) -1'. –
@ MichaelKrelin-hacker: '(time_t) -1' jest trochę inny; standard wyraźnie mówi, że jest to wartość zwrócona przez 'time()', jeśli nie można ustalić bieżącego czasu. A 'time_t' jest często typem podpisanym, więc' (time_t) -1' jest zwykle 1 sekundę przed epoką. –
Zasadniczo nie można. Bez względu na to, jaką wartość użyjesz, może być ona ważna. Lepiej przekazać flagę, że jest ona nieważna.
A co zrobić, aby oznaczać, że int
jest nieważny? -1 jest poprawną wartością dla int. Te typy nie mają oznaczonych "nieprawidłowych" wartości. Możesz zdecydować się na wybraną wartość (która nigdy nie może być wartością, którą reprezentuje twoja zmienna), aby reprezentować nielegalną wartość, ale to jest twoja własna definicja, a nie coś, co ludzie zazwyczaj używają.
Osobiście nie podoba mi się ten sposób. Wolę utworzyć inną zmienną, bool IsValid
, która powie, czy wartość tej zmiennej size_t jest poprawna. Czasami może nawet lepiej stworzyć klasę, która je enkapsuluje.
Jeśli mówisz o std :: string, to nieprawidłową wartością size_t jest std :: string :: npos. Zwykle nie powinieneś używać -1, ponieważ size_t jest unsigned i możesz uzyskać nieudane porównania na kompilatorze wykonującym niejawne konwersje między typami.
Na przykład stroję std :: strings ma wartość 0XFFFFFFFFFFFFFF ..., która jest wartością binarną równą -1. Sprawdza także maksymalną dozwoloną wartość niepodpisanego pola size_t.
to 'string :: size_type', a nie' size_t' ;-) –
Nadal ... reszta odpowiedzi jest solidnym złotem. CZYSTE ZŁOTO! – Kieveli
Przynajmniej świeci ;-) –
Moja wersja jest:
#include <limits>
#define invalid_index std::numeric_limits<size_t>::max()
'std :: numeric_limits
- 1. getBoundingClientRect, niepoprawna wartość wysokości dla wbudowanego SVG
- 2. Niepoprawna wartość dla usługi <position>
- 3. Niepoprawna wartość średnia?
- 4. Niepoprawna wartość schematu Ścieżka tablicy
- 5. Spring - Niepoprawna wartość argumentu: java.io.NotSerializableException
- 6. Niepoprawna wartość podczas zapisywania enum
- 7. Wartość atrybutu useBean ... jest niepoprawna
- 8. Niepoprawna wartość indeksu tablic indeksowych
- 9. Niepoprawna wartość całkowita: '' dla kolumny 'id' w wierszu 1
- 10. Niepoprawna wartość ciągu: '\ xEF \ xBF \ xBD' dla kolumny
- 11. Lokalizacja dla "wartość {0} jest niepoprawna" w przypadku int przepełnienia
- 12. Wartość dla "magazynu kluczy" jest niepoprawna. Musi rozwiązać pojedynczą ścieżkę
- 13. Niepoprawna wartość ciągu: '\ xC2 \ x9Fe 10 ...' dla kolumny
- 14. prcomp i ggbiplot: niepoprawna wartość "zgnilizny"
- 15. Mysql - Mysql2 :: Błąd: Niepoprawna wartość ciągu:
- 16. RuntimeWarning: niepoprawna wartość napotkana w maksimum
- 17. jest size_t zawsze unsigned?
- 18. "size_t" kontra "container :: size_type"
- 19. Przepełnienia w addendach size_t
- 20. Konwertowanie size_t na liczbę całkowitą (C++)
- 21. Przesyłanie z size_t do int, lub iterować z size_t?
- 22. Poprawny specyfikator formatu printf dla size_t:% zu lub% Iu?
- 23. FFI: Jak deklarują `size_t`
- 24. Wydajność size_t w C++
- 25. . Odpowiednik .NET size_t
- 26. Obsada ssize_t lub size_t
- 27. Niepoprawna wartość podczas liczenia komórek w różnych wersjach programu Excel
- 28. Czy uintptr_t i size_t same?
- 29. Niepoprawna ścieżka dla pliku Pods.debug.xcconfig w Xcode?
- 30. Mysql2 :: Błąd: Niepoprawna wartość ciągu: '\ xE2 \ x80 \ xA8 \ x09
Jak -1 "nie działa"? –
Osobiście odmawiam używania systemów innych niż POSIX i polegam na dostępnym 'ssize_t'. –