Ich arbeite mit Audiodaten. Ich möchte die Beispieldatei rückwärts abspielen. Die Daten werden als unsigned ints gespeichert und schön dicht gepackt. Gibt es eine Möglichkeit anzurufen memcpy
das wird in umgekehrter Reihenfolge kopiert. dh wenn ich 1,2,3,4 in einem Array gespeichert hätte, könnte ich anrufen memcpy
und magisch Kehre sie um, sodass ich 4,3,2,1 bekomme.
C memcpy umgekehrt
Aran Mulholland
Nein, memcpy macht das nicht rückwärts. Wenn Sie in C arbeiten, schreiben Sie eine Funktion dafür. Wenn Sie wirklich in C++ arbeiten, verwenden Sie std::reverse oder std::reverse_copy.
-
Ich weiß, das ist alt, aber könnten Sie ein Beispiel für eine Funktion posten, die dies tut? Es ist einfach, aber es könnte jemandem helfen.
– Austin Mullins
17. Juli 2014 um 14:41 Uhr
Alok Singhal
Das funktioniert beim Kopieren int
s umgekehrt:
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];
}
So wie memcpy()
die Regionen, auf die durch gezeigt wird dst
und src
darf nicht überlappen.
Wenn Sie an Ort und Stelle umkehren möchten:
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;
}
}
Beide oben genannten Funktionen sind portabel. Sie können sie möglicherweise beschleunigen, indem Sie hardwarespezifischen Code verwenden.
(Ich habe den Code nicht auf Korrektheit getestet.)
-
Was ist die Effizienz davon im Vergleich zu memcpy?
– Aran Mulholland
11. Februar 2010 um 5:44 Uhr
-
memcpy
sollte O(n) sein und dies auchreverse_memcpy
Funktion.– Traumlax
11. Februar 2010 um 5:50 Uhr
-
Mit meinem Schnelltest, mit
-O3
Optimierung,reverse_memcpy()
ist etwa 3 mal langsamer alsmemcpy()
zum Kopieren von 1000000 Bytes. Für 10000 Iterationen mit 1000000 Bytes,memcpy()
dauerte 4 Sekunden, undreverse_memcpy()
nahm 11. Aber diese Zahlen sind für einen ganz bestimmten Fall, also möchten Sie vielleicht die Dinge selbst testen. Natürlich sind, wie Dreamlax sagte, beide O(n).– Alok Singhal
11. Februar 2010 um 5:56 Uhr
-
@mP: Mir wurde klar, dass das OP möglicherweise an Ort und Stelle umkehren möchte. Ich habe meinen Beitrag bearbeitet, als Sie den Kommentar abgegeben haben. Stimme deinem Punkt voll und ganz zu. Die “Erstausgabe” meiner Antwort enthielt eine Warnung vor der Notwendigkeit nicht überlappender Regionen und der Verwendung von
restrict
Schlüsselwort in C99 …– Alok Singhal
11. Februar 2010 um 6:10 Uhr
-
Die erste Version würde sehr davon profitieren
restrict
die Argumente.– Alexander C.
24. Mai 2015 um 22:20 Uhr
C hat keine solche Funktion, aber es ist sehr einfach, eine zu schreiben.
– Alok Singhal
11. Februar 2010 um 5:38 Uhr
Es könnte sich lohnen, darüber nachzudenken, wie Sie sich ändern iterieren Ich vermute, es wäre effizienter, die Daten zu überschreiben, anstatt die Reihenfolge zu ändern …
– Markus Elliot
11. Februar 2010 um 5:55 Uhr
Du hast mich ratlos gemacht magisch.
– Craig McQueen
11. Februar 2010 um 6:06 Uhr
Mark, ich iteriere nicht, ich kopiere Puffer in Blöcken. Craig – Computer sind magisch, richtig? 🙂
– Aran Mulholland
11. Februar 2010 um 6:28 Uhr
Computer könnten sein ziemlich coolwas eine grobe Annäherung an ist Magie für einige Zwecke, denke ich. 🙂
– Craig McQueen
11. Februar 2010 um 6:48 Uhr