C memcpy в обратном порядке - PullRequest
12 голосов
/ 11 февраля 2010

Я работаю с аудио данными. Я хотел бы воспроизвести файл образца в обратном порядке. Данные хранятся в виде неподписанных целых и упакованы хорошо и плотно. Есть ли способ вызова memcpy, который будет копировать в обратном порядке. то есть, если бы у меня было 1,2,3,4, сохраненных в массиве, я мог бы вызвать memcpy и магически обратить их вспять, чтобы я получил 4,3,2,1.

Ответы [ 2 ]

9 голосов
/ 11 февраля 2010

Это работает для копирования int с в обратном порядке:

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

}

Так же, как memcpy(), регионы, на которые указывают dst и src, не должны перекрываться.

Если вы хотите повернуть вспять на месте:

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

Обе функции выше являются переносимыми. Вы можете сделать их быстрее, используя аппаратный код.

(я не проверял код на правильность.)

8 голосов
/ 11 февраля 2010

Нет, memcpy не сделает это задом наперед. Если вы работаете в C, напишите функцию для этого. Если вы действительно работаете в C ++, используйте std :: reverse или std :: reverse_copy.

...