2010-02-22 8 views
7

È possibile utilizzare un valore float come indice di una matrice? Cosa succederebbe se un'espressione utilizzata come indice avesse come risultato un valore float?Valori di virgola mobile come indice in una matrice in C++

+2

Suona come i compiti? –

+0

Una pessima idea a causa di errori di arrotondamento. Tuttavia, a volte ciò è utile, ma il valore deve essere prima convertito in numero intero e il controllo dei limiti (o limitazione) deve essere eseguito prima dell'accesso. Questa operazione può essere utile per es. per approssimare i valori per una funzione a virgola mobile utilizzando una tabella di ricerca. – Tronic

risposta

10

Il valore float sarà fusa a int (che può dare avviso o errore a seconda del livello di avviso del compilatore)

s1 = q[12.2]; // same as q[12] 
s2 = q[12.999999]; // same as q[12] 
s3 = q[12.1/6.2]; // same as q[1] 
9

Sì. Ma è inutile. Il valore float verrà troncato a un numero intero.

(È possibile utilizzare std::map<float, T>, tuttavia, ma il più delle volte vi perderete i valori previsti a causa di imprecisione.)

+1

+1 per 'std :: map' –

+1

Per quanto riguarda l'imprecisione, penso che ci dovrebbe essere un modo per fornire la propria funzione di confronto in cui è possibile includere un 'epsilon' ... una tolleranza di sorta. –

+0

@Agnel Kurian std :: map of course ti consente esattamente questo –

1

sarà fusa a int.

2

Un array C++ è una sequenza contigua di posizioni di memoria. a[x] significa "la x posizione di memoria dopo quella puntata da a".

Cosa significherebbe accedere al 12.4 ° oggetto in una sequenza?

+0

Nota per i pedanti: sì, so che gli offset dell'array non sono una semplice aggiunta di interi ai puntatori: questa frase presuppone che una "posizione di memoria" sia la dimensione di un membro dell'array, quindi per un int a [], a [5] significa la quinta parola, non il quinto byte. – Crashworks

0

Questo è un errore. In [expr.sub]:

Un'espressione postfisso seguita da un'espressione tra parentesi quadre è un'espressione post fi x. Una delle espressioni deve avere il tipo "puntatore a T" e l'altra deve avere l'enumerazione senza ambito o il tipo integrale.

Non sono a conoscenza di una clausola standard che specifica che la conversione dovrebbe accadere qui (è vero, io non sarei sorpreso se una simile clausola esisteva), anche se il test con ideone.com ha prodotto un errore di compilazione.

Tuttavia, se si esegue l'iscrizione di una classe anziché di un puntatore — ad es. std::vector o std::array — quindi il sovraccarico di operator[] avrà la solita semantica di una chiamata di funzione e gli argomenti in virgola mobile verranno convertiti nel corrispondente size_type.

Problemi correlati