2010-02-11 26 views
9

Ses verileriyle çalışıyorum. Örnek dosyayı tersten çalmak isterim. Veriler imzasız olarak depolanır ve iyi ve sıkı paketlenir. Ters sırayla kopyalanacak memcpy aramak için bir yolu var mı. Yani bir dizide 1,2,3,4 saklanmış olsaydım, memcpy ve sihirli onları geri çevirebilirim, böylece 4,3,2,1 elde ederim.C memcpy ters yönde

+0

C böyle bir işlevi yoktur, ancak bir yazmak çok kolaydır. –

+1

Siparişi değiştirmekten ziyade veri üzerinde * yinelemeyi değiştirmeyi düşünmeye değer olabilirdim, daha verimli olacağından şüpheliyim ... –

+4

Bana * büyülü * ile boğulmuş oldun. –

cevap

6

Bu tersten int s kopyalamak için çalışır:

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

} 

Sadece memcpy() gibi bölgeler sivri-to örtüşmemelidir dst tarafından ve src.

sen yerinde tersine çevirmek istiyorsanız

:

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

Her iki fonksiyon yukarıda taşınabilir. Donanımı özel kod kullanarak daha hızlı yapabilirsiniz.

(ı doğruluğundan kodu test etmedim.)

+3

Memnuniyetle karşılaştırıldığında bunun etkinliği nedir? –

+2

'memcpy', O (n) olmalıdır ve bu' reverse_memcpy' işlevi olmalıdır. – dreamlax

+3

Hızlı testimde, -O3' optimizasyonu ile, reverse_memcpy() ', 1000000 bayt kopyalamak için memcpy()' den 3 kat daha yavaştır. 1000000 byte ile 10000 yineleme için, memcpy() '4 saniye sürdü ve' reverse_memcpy() '11 aldı. Ama bu rakamlar çok özel bir durum için, bu yüzden kendiniz için şeyler test etmek isteyebilirsiniz. Tabi ki, rüyaların söylediği gibi, ikisi de O (n). –

8

Hayır, memcpy bunu geriye doğru yapmayacaktır. C'de çalışıyorsanız, bunu yapmak için bir işlev yazın. Gerçekten C++ 'da çalışıyorsanız std :: reverse veya std :: reverse_copy kullanın.

+1

Bunun eski olduğunu biliyorum, ancak bunu yapan bir işlev örneği gönderir misiniz? Bu basit, ama birine yardımcı olabilir. –