C memcpy umgekehrt

Lesezeit: 3 Minuten

Benutzer-Avatar
Aran Mulholland

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

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

Benutzer-Avatar
Alok Singhal

Das funktioniert beim Kopieren ints 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 auch reverse_memcpy Funktion.

    – Traumlax

    11. Februar 2010 um 5:50 Uhr

  • Mit meinem Schnelltest, mit -O3 Optimierung, reverse_memcpy() ist etwa 3 mal langsamer als memcpy() zum Kopieren von 1000000 Bytes. Für 10000 Iterationen mit 1000000 Bytes, memcpy() dauerte 4 Sekunden, und reverse_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 restrictdie Argumente.

    – Alexander C.

    24. Mai 2015 um 22:20 Uhr

1055720cookie-checkC memcpy umgekehrt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy