2010-02-11 10 views
9

Je travaille avec des données audio. Je voudrais lire le fichier d'exemple à l'envers. Les données sont stockées en tant qu'ints non signés et emballés bien et serrés. Y at-il un moyen d'appeler memcpy qui copiera dans l'ordre inverse. c'est-à-dire que si j'avais 1,2,3,4 stocké dans un tableau, pourrais-je appeler memcpy et comme par magie les inverser donc j'obtiens 4,3,2,1.C memcpy à l'envers

+0

C ne possède pas de fonction comme ça, mais il est très facile d'écrire un. –

+1

Il pourrait être utile d'envisager de changer la façon dont vous * itérez * sur les données plutôt que de changer l'ordre, je suppose que ce serait plus efficace ... –

+4

Vous m'avez trouvé perplexe avec * magiquement *. –

Répondre

6

Cela fonctionne pour la copie int s en sens inverse:

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

} 

Tout comme memcpy(), les régions pointé par dst et src ne doivent pas se chevaucher.

Si vous souhaitez inverser en place:

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

Les deux fonctions ci-dessus sont portables. Vous pourriez être en mesure de les rendre plus rapides en utilisant du code spécifique au matériel.

(je ne l'ai pas testé le code correct.)

+3

quelle est l'efficacité de ceci en comparaison avec memcpy? –

+2

'memcpy' devrait être O (n) et cette fonction' reverse_memcpy' devrait l'être aussi. – dreamlax

+3

Avec mes tests rapides, avec l'optimisation '-O3',' reverse_memcpy() 'est environ 3 fois plus lent que' memcpy() 'pour copier 1000000 octets. Pour 10000 itérations avec 1000000 octets, 'memcpy()' a pris 4 secondes, et 'reverse_memcpy()' a pris 11. Mais ces chiffres sont pour un cas très spécifique, donc vous voudrez peut-être tester les choses par vous-même. Bien sûr, comme le dit dreamlax, les deux sont O (n). –

8

Non, memcpy ne le fera pas à l'envers. Si vous travaillez en C, écrivez une fonction pour le faire. Si vous travaillez vraiment en C++, utilisez std :: reverse ou std :: reverse_copy.

+1

Je sais que c'est vieux, mais pourriez-vous poster un exemple d'une fonction qui fait cela? C'est simple, mais ça pourrait aider quelqu'un. –