Einträge in Array eins nach vorne verschieben?



  • Gibt es eine spezielle Möglichkeit, die Einträge eines Arrays um jeweils eine Position zu verschieben (wobei das erste Element verloren geht)?

    Also quasi das hier:

    int array[10] = { ... };
    
    for (i = 0; i < 10 - 1; i++)
        array[i] = array[i + 1];
    
    array[9] = 0;
    

    Gibt es dafür irgendein Sprachfeature oder eine effektivere Variante, die das mit einem Mal fix macht? Oder muss man es tatsächlich manuell mit so einer Schleife programmieren?



  • memmove(&array[0], &array[1], 9*sizeof(int));
    

    so in etwa?



  • Kann man da sicher sein, dass das auch funktioniert, wenn dasselbe Array benutzt wird?

    Ich meine, was ist, wenn die Implementierung nicht von vorne nach hinten kopiert, sondern von hinten nach vorne?
    Immerhin ist

    LDX size
    @loop:
      DEX
      BNE @loop
    

    kürzer als

    LDX #$00
    @loop:
      INX
      CPX size
      BNE @loop
    

  • Mod

    Elmor schrieb:

    Kann man da sicher sein, dass das auch funktioniert, wenn dasselbe Array benutzt wird?

    Ja, memmove ist gerade für diesen Fall da. Für alles andere gibt es memcpy.

    Das hätte auch in jeder Referenz zu memmove gestanden.



  • SeppJ schrieb:

    Das hätte auch in jeder Referenz zu memmove gestanden.

    Und woher hätte ich das wissen sollen, wo ich gar nicht lesen kann?



  • Je nach Anwendungsfall und/oder Zielsystem kann ein Ringpuffer die bessere Lösung sein da man sich das Verschieben von N Elementen sparen kann.


  • Mod

    Elmor schrieb:

    SeppJ schrieb:

    Das hätte auch in jeder Referenz zu memmove gestanden.

    Und woher hätte ich das wissen sollen, wo ich gar nicht lesen kann?

    Du hast den Eindruck erweckt, des Lesens und Schreibens mächtig zu sein. Muss ich mich wohl geirrt haben.



  • Elmor schrieb:

    Kann man da sicher sein, dass das auch funktioniert, wenn dasselbe Array benutzt wird?

    Ich meine, was ist, wenn die Implementierung nicht von vorne nach hinten kopiert, sondern von hinten nach vorne?
    Immerhin ist ...

    Doch, memmove kopiert das Zeug vorher irgendwo hin. Damit isses wurscht.
    Hab' mich erinnert, mal sowas gehabt zu haben und mit memcpy das Problem mit "if areas are overlapping, the result will be undefined." bekommen zu haben. Ein Hinweis auf memmove war damals allerdings nicht da, also hab' ich's handgeschnitzt. Des akademischen Interesses halber hab' ich's jetzt mal mit memmove probiert und das ist tatsächlich deutlich langsamer.

    Die performanteste Lösung erhältst Du aber, wenn Du Tims Vorschlag in Betracht ziehst und einfach nur den Auslesepunkt verschiebst, ob als Array- Index oder Pointer, egal.



  • Bastel dir einen ringbuffer mit 2 zeigern die um 1 element versetzt sind. Dann brauchst du nicht jedes mal das ganze array umzuschaufeln.

    Ach das steht hier ja schon


Anmelden zum Antworten