2010-02-11 11 views
9

Estoy trabajando con datos de audio. Me gustaría reproducir el archivo de muestra al revés. Los datos se almacenan como entradas sin firmar y se empaquetan bien y apretados. ¿Hay alguna manera de llamar al memcpy que copiará en orden inverso? es decir, si tuviera 1,2,3,4 almacenado en una matriz, ¿podría llamar a memcpy y mágicamente invertirlos para obtener 4,3,2,1.C memcpy en reversa

+0

C no tiene una función de esa manera, pero es muy fácil de escribir uno. –

+1

Podría valer la pena considerar cambiar la forma * de iterar * sobre los datos en lugar de cambiar el orden, sospecho que sería más eficiente ... –

+4

Me has confundido con * mágicamente *. –

Respuesta

6

Esto funciona para copiar int s en sentido 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]; 

} 

Al igual que memcpy(), las zonas en punta-a por dst y src no deben solaparse.

Si desea invertir en el lugar:

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

Tanto las funciones anteriores son portátiles. Es posible que pueda hacerlos más rápidos utilizando un código específico del hardware.

(no he probado el código de corrección.)

+3

¿Cuál es la eficacia de esto en comparación con memcpy? –

+2

'memcpy' debería ser O (n) y así debería funcionar esta función' reverse_memcpy'. – dreamlax

+3

Con mi prueba rápida, con la optimización '-O3',' reverse_memcpy() 'es aproximadamente 3 veces más lenta que' memcpy() 'para copiar 1000000 bytes. Para 10000 iteraciones con 1000000 bytes, 'memcpy()' tomó 4 segundos, y 'reverse_memcpy()' tomó 11. Pero estos números son para un caso muy específico, por lo que es posible que desee probar las cosas por sí mismo. Por supuesto, como dijo dreamlax, ambos son O (n). –

8

No, memcpy no hará eso al revés. Si estás trabajando en C, escribe una función para hacerlo. Si realmente está trabajando en C++, use std :: reverse o std :: reverse_copy.

+1

Sé que esto es viejo, pero ¿podría publicar un ejemplo de una función que hace esto? Es simple, pero podría ayudar a alguien. –