2010-02-11 13 views
9

Pracuję z danymi dźwiękowymi. Chciałbym odtworzyć przykładowy plik w odwrotnej kolejności. Dane są przechowywane jako unsigned ints i zapakowane ładnie i mocno. Czy istnieje sposób, aby zadzwonić pod numer memcpy, który zostanie skopiowany w odwrotnej kolejności. tj. gdybym miał 1,2,3,4 przechowywane w tablicy, czy mogę zadzwonić memcpy i magicznie odwrócić je, więc otrzymuję 4,3,2,1.C Notatka na odwrocie

+0

C nie posiada funkcję takiego, ale to bardzo łatwo napisać. –

+1

Być może warto zastanowić się nad zmianą sposobu * iteracji * nad danymi, zamiast zmieniać kolejność, podejrzewam, że byłaby bardziej efektywna ... –

+4

Masz mnie zafascynowany * magicznie *. –

Odpowiedz

6

Działa to na kopiowanie int s odwrotnie:

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]; 

} 

Podobnie jak memcpy(), regiony wskazał-to przez dst i src nie mogą się pokrywać.

Jeśli chcesz, aby odwrócić na miejscu:

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; 
    } 
} 

Obie funkcje powyżej są przenośne. Możesz je przyspieszyć, używając specyficznego dla sprzętu kodu.

(nie testowałem kod poprawności.)

+3

jaka jest efektywność tego w porównaniu z memcpy? –

+2

'memcpy' powinno być O (n), podobnie jak funkcja' reverse_memcpy'. – dreamlax

+3

Z moimi szybkimi testami, przy optymalizacji '-O3',' reverse_memcpy() 'jest około 3 razy wolniejsze niż' memcpy() 'dla kopiowania 1000000 bajtów. Dla 10000 iteracji ze 1000000 bajtów, 'memcpy()' zajęło 4 sekundy, a 'reverse_memcpy()' wziął 11. Ale te liczby są dla bardzo konkretnego przypadku, więc możesz chcieć przetestować rzeczy dla siebie. Oczywiście, jak powiedział dreamlax, oba są O (n). –

8

Nie, memcpy nie zrobi tego w tył. Jeśli pracujesz w C, napisz funkcję, aby to zrobić. Jeśli naprawdę pracujesz w C++, użyj std :: reverse lub std :: reverse_copy.

+1

Wiem, że to jest stare, ale czy możesz wysłać przykład funkcji, która to robi? To proste, ale może pomóc komuś. –