# Array löschen



## timod79 (25 März 2009)

Hallo ich nehme alle 10 ms ein Messwert auf, diesen speicher ich dann in einem Array mit 500 Stellen.Meine Messwerte lasse ich mir später auf meinem Rechner als Kurve anzeigen.Jetzt mein Problem ich habe mal 300 und mal nur 200 Messwerte.Wie kann ich mein Array komplett auf Null zurücksetzen?Wenn ich nur an den Anfang springe nimmt er zwar meine 200 Werte neu auf, hat aber noch die Alten bis 300 Gespeichert. 

(*Array alle 10 ms mit Messwerten des Durchflusses füllen*)
Timer1 (IN:=SP1.Q1 AND NOT Timer2.Q,PT:=T#5ms);
Timer2 (IN:=NOT Timer1.Q,PT:=T#5ms);
ft1 (CLK:=Timer1.Q);
IF ft1.Q THEN
TVar_:=Durchfluss;
i:=i+1;
END_IF


(*Array wieder auf null Punkt setzen*)
ft2(CLK:=Digitalausgang_2);
SP2(SET:=ft2.Q);
SP2(RESET1:=Timer3.Q);
Timer3(IN:=SP2.Q1,PT:=T#500ms);
IF Timer3.Q THEN
i:=0;
END_IF_


----------



## Cerberus (25 März 2009)

```
zaehl: int;
 
FOR zaehl := 0 TO 500 BY 1 DO
    TVar[zaehl] := 0;
END_FOR
```


----------



## Ralle (25 März 2009)

Statt i := 0


```
FOR i:= 0 TO 500 DO
   TVar[i]:=0;     
END_FOR;
```


----------



## timod79 (25 März 2009)

Hallo Danke das hab ich auch schon versucht, dann springt mein Wert auf 500 und zählt von da an weiter.


----------



## Cerberus (25 März 2009)

Dann setze nach dem Löschen des Arrays i wieder auf 0!


----------



## Ralle (25 März 2009)

Cerberus schrieb:


> Dann setze nach dem Löschen des Arrays i wieder auf 0!




```
(*Array wieder auf null Punkt setzen*)
ft2(CLK:=Digitalausgang_2);
SP2(SET:=ft2.Q);
SP2(RESET1:=Timer3.Q);
Timer3(IN:=SP2.Q1,PT:=T#500ms);
IF Timer3.Q THEN

FOR i:= 0 TO 500 DO
   TVar[i]:=0;     
END_FOR;

i:=0;

END_IF
```


----------



## timod79 (25 März 2009)

Super Danke hab es hin bekommen.


----------



## RobiHerb (25 März 2009)

*Noch einfacher*

Noch einfacher, Du weisst, wo Dein letzter erfasster Wert lag, zähle von dort jeden Index runter bis 1 und setze den Wert[index] := 0;

WHILE ( iIndex <> 0) DO
        Wert[iIndex] := 0;
        iIndex := iIndex -1;
END_WHILE
Wert[iIndex] := neuerWert;


Hinweis an die Performance Freaks:
WHILE Constructe sind in der Regel schneller als FOR ...
Tests auf Null sind ebenfalls immer schneller als auf andere Zahlen.


----------



## Gizzl0r (7 November 2017)

Hi,
um kein neues Thema zu eröffnen wollte ich mal nachfragen ob es evtl. auch eine schnellere art gibt das array zu löschen als das vorhandene Array mit einem leeren zu überschreiben.
Als beispiel 
Array:=Array_empty;


----------



## Guga (7 November 2017)

Klar geht das.
Alternative: Memset(ADR(Array), 0, sizeof(array)); -> siehe Doku fuer naehere Infos.


----------



## seehma (14 November 2017)

Guga schrieb:


> Klar geht das.
> Alternative: Memset(ADR(Array), 0, sizeof(array)); -> siehe Doku fuer naehere Infos.



Die Memset Methode hat einen wesentlichen *Vorteil*: Wenn die Struktur erweitert wird, wird die neue Variable automatisch mitgenommen, hingegen bei der Schleife muss man das immer nachziehen.

Klar, Memset ist ein wenig schneller, aber nur unwesentlich. 
Man spart sich hier nur das Umladen der Countervariable in der FOR Schleife.
Der Compiler optimiert das schon recht gut...

Ein *Problem *gibts mit Memset, wenn man das über einen Baustein drüberlaufen lässt und diesen nachher aufruft --> Exception. 

Sg seehma


----------

