2010-02-11 7 views
9

Sto lavorando con dati audio. Mi piacerebbe riprodurre il file di esempio al contrario. I dati vengono memorizzati come valori non firmati e imballati in modo piacevole e stretto. C'è un modo per chiamare memcpy che verrà copia in ordine inverso. Ad esempio, se avessi memorizzato 1,2,3,4 in un array, potrei chiamare memcpy e magicamente invertirli così ottengo 4,3,2,1.C memcpy al contrario

+0

C non ha una funzione del genere, ma è molto facile scrivere uno. –

+1

Potrebbe valere la pena considerare di cambiare il modo in cui si * itera * sui dati piuttosto che cambiare l'ordine, temo che sarebbe più efficiente ... –

+4

Mi hai fatto inciampare * magicamente *. –

risposta

6

Questo funziona per la copia di int s in senso inverso:

void reverse_intcpy(int *restrict dst, const int *restrict src, size_t n) 
{ 
    size_t i; 

    for (i=0; i < n; ++i) 
     dst[n-1-i] = src[i]; 

} 

Proprio come memcpy(), le regioni rilevare-to da dst e src non devono sovrapporsi.

Se si vuole invertire sul posto:

void reverse_ints(int *data, size_t n) 
{ 
    size_t i; 

    for (i=0; i < n/2; ++i) { 
     int tmp = data[i]; 
     data[i] = data[n - 1 - i]; 
     data[n - 1 - i] = tmp; 
    } 
} 

Entrambe le funzioni sopra sono portatili. Potresti essere in grado di renderli più veloci utilizzando il codice specifico dell'hardware.

(non ho ancora testato il codice per correttezza.)

+3

qual è l'efficienza di questo rispetto alla memcpy? –

+2

'memcpy' dovrebbe essere O (n) e così dovrebbe questa funzione' reverse_memcpy'. – dreamlax

+3

Con il mio test rapido, con l'ottimizzazione '-O3',' reverse_memcpy() 'è circa 3 volte più lento di' memcpy() 'per copiare 1000000 byte. Per 10000 iterazioni con 1000000 byte, 'memcpy()' ha impiegato 4 secondi e 'reverse_memcpy()' ha preso 11. Ma questi numeri sono per un caso molto specifico, quindi potresti voler testare le cose da solo. Naturalmente, come ha detto Dreamlax, entrambi sono O (n). –

8

No, memcpy non lo farà all'indietro. Se stai lavorando in C, scrivi una funzione per farlo. Se stai davvero lavorando in C++ usa std :: reverse o std :: reverse_copy.

+1

So che questo è vecchio, ma potresti pubblicare un esempio di una funzione che fa questo? È semplice, ma potrebbe aiutare qualcuno. –