2009-09-14 16 views
8

Cosa usano le persone per indicare che size_t non è valido? -1 non funziona e 0 può essere una dimensione valida.Valore non valido per size_t

+0

Come si fa a -1 "non funziona"? –

+0

Personalmente, mi rifiuto di usare sistemi non POSIX e mi affido che 'ssize_t' sia disponibile. –

risposta

10

Forse ((size_t)-1)?

A rigor di termini, si è una dimensione valida, ma una volta che hai questo uno non siete probabilmente bisogno di qualsiasi altro ;-)

+1

alcune delle funzioni di stringa multiby C99 fanno questo: restituiscono '(size_t) (- 1)' o anche '(size_t) (- 2)' per indicare condizioni anormali; non è ottimale, ma funziona nella pratica; se la ragione della tua domanda è la gestione degli errori, potrebbe essere una buona idea passare un puntatore a una variabile di errore (ad esempio un flag di errore di tipo '_Bool', un codice di errore di tipo' int' o un messaggio di errore di tipo ' const char * ') come argomento aggiuntivo – Christoph

+0

Sì, è un idioma comune. Spesso puoi vedere anche il '(time_t) -1'. –

+0

@ MichaelKrelin-hacker: '(time_t) -1' è un po 'diverso; lo standard dice esplicitamente che è il valore restituito da 'time()' se non è possibile determinare l'ora corrente. E 'time_t' è spesso un tipo firmato, quindi' (time_t) -1' è tipicamente 1 secondo prima dell'epoca. –

3

Fondamentalmente non è possibile. Qualunque valore tu usi potrebbe essere valido. Meglio passare una bandiera dicendo che non è valido.

1

E cosa fare per indicare che un int non è valido? -1 è un valore valido per un int. Questi tipi non hanno valori "non validi" designati. Puoi decidere di scegliere un determinato valore (che non può mai essere normalmente il valore di ciò che rappresenta la tua variabile) per rappresentare un valore illegale, ma questa è la tua definizione, e non qualcosa che le persone generalmente usano.

Personalmente, non mi piace in questo modo. Preferisco creare un'altra variabile, bool IsValid, che dirà se il valore di tale variabile size_t è valido. A volte, potrebbe anche essere meglio creare una classe per incapsularli.

4

Se stai parlando di std :: string, il valore non valido di size_t è std :: string :: npos. Normalmente non dovresti usare -1 perché un size_t non è firmato, e puoi ottenere confronti non riusciti su un compilatore che fa conversioni implicite tra tipi.

Detto questo, std :: strings's npos è impostato su 0XFFFFFFFFFFFFFFFFFF ... che è il binario equivallent di -1. Valuta anche il valore massimo consentito per un campo size_t senza segno.

+0

è 'string :: size_type', non' size_t' ;-) –

+1

Ancora ... il resto della risposta è d'oro massiccio ORO SOLIDO! – Kieveli

+0

Almeno brilla ;-) –

0

La mia versione è:

#include <limits> 
#define invalid_index std::numeric_limits<size_t>::max() 
+3

'std :: numeric_limits :: max()' non viene compilato in 'C' poiché questa domanda è codificata. – chux

Problemi correlati