Array befüllen

Hallo Gemeinde,

ich hänge hier an einem kleinen Problem, eventuell kann mir jemand mit einem Codeschnipsel auf die Sprünge helfen :slight_smile:

Ich möchte ein Array mit 100 floatwerten befüllen.

Die Werte kommen alle 5 Sekunden von einem Sensor. Die Werte liegen also am Anfang nicht alle vor, sondern „tröpfeln“ langsam das array voll.

Jetzt der Knackpunkt, an dem ich hänge:

wenn der 101te Wert vom Sensor kommt, soll der erste Wert (Sensor[0]) rausfliegen, und alle anderen nachrücken…

Der neue Wert soll in Sensor[99] gespeichert werden, und Sensor[98] soll den alten wert von Sensor [99] bekommen und das ganze bis Sensor[0] rekursiv…

Sorry, wenn das ein wenig unverständlich ausgedrückt ist, aber ich hoffe, ihr versteht mich halbwegs :slight_smile:

Ganz liebe Grüße
Sascha

Array_shift entfernt das erste Elemente.
Array_push fügt hinten eins an.
Siehe
PHP: array_shift - Manual
PHP: array_push - Manual
Wann du was machen musst, kannst du ja durch Count oder sizeof ermitteln.
PHP: count - Manual
Michael

Vielen Dank für die schnelle Antwort,

leider programmiere ich das gerade in C++ (Arduino) und merke gerade, dass es diese Funktionen da nicht gibt :frowning:

Aber nur zum Verständnis…hätte array_push alle anderen werte auch um einen Speicherplatz nach hinten geschoben ?
Das wäre genau das, was ich gerade bräuchte…

Liebe Dank
Sascha

Nein Array Shift hatte das erste (älteste) gelöscht. Dadurch rutschen die anderen einen auf.
Wo steht den das du das in C++ machen willst…
Warum fragst du so etwas im IPS Forum? Da gibt es doch bestimmt bessere für :wink:
Michael

da hast du natürlich recht…ist quasi eine ausgelagerte Hardware, die dann mit IPS später verknüpft wird…

Danke und entschuldige wegen der Verwirrung :slight_smile:

LG
Sascha

Ich habe zwar kein Beispiel parat, aber ich würde mir einfach die aktuelle Stelle vom Array merken und wenn das Maximum erreicht ist, von vorne anfangen.
Will man dann den ältesten Wert lesen, ist es der aktuelle Index +1 (oder halt 0 wenn bisher weniger als max Anzahl Daten geschrieben wurden).
Gibt bestimmt auch diverse fertige Libs oder Funktionen dafür. Da ich meistens aber nur bei MCUs mit C++ arbeite; bin ich da eher nicht der spezie :wink:
Habe da irgendwo auch mal eine Queue benutzt um einen dynamischen Datenringspeicher umzusetzen.
Michael

Ja, mit den Ringspeichern spiele ich auch gerade rum :slight_smile:

Das scheint mir momentan am performativsten zu sein.

Mit einer for schleife 700 einträge um eins nach hinten zu kopieren hat mir gerade so die Kiste zerlegt, das ich eine halbe Stunde nichts mehr drauf spielen konnte :slight_smile:

Ich schau mir die Ringspeicher mal genauer an…

Vielen Dank und liebe Grüße
Sascha

Ist ja Quark Daten zu verschieben.
Dann lieber nur einen Index versetzen :wink:
Michael

Ringpuffer ist natürlich immer gut, weil die Bedeutung dann schon am klarsten ist, sonst könnte man das so machen.
Das ist von der Performance sicher kein Problem


#include <stdio.h>
#include <string.h>

main(int argc, char *argv[])
{
    double a[4];
    int i, j, n = 4;

    // initialisieren 
    memset(a, 0, sizeof(a)); 

    for (i = 1; i < 5; i++) {

        // wert setzen
        memcpy(&a[0], &a[1], sizeof(a[0]) * n - 1);
        a[n - 1] = (float)i;

        for (j = 0; j < n; j++)
            printf("a[%d]=%f
", j, a[j]);
        printf("
");
    }
}

das wäre der Output


a[0]=0.000000
a[1]=0.000000
a[2]=0.000000
a[3]=1.000000

a[0]=0.000000
a[1]=0.000000
a[2]=1.000000
a[3]=2.000000

a[0]=0.000000
a[1]=1.000000
a[2]=2.000000
a[3]=3.000000

a[0]=1.000000
a[1]=2.000000
a[2]=3.000000
a[3]=4.000000