_Array_AVG in der Oscat 2.7.2

Begonnen von Belacqua, 03. April 2008, 09:50:38

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

Belacqua

Moin!

Ich habe mir interessehalber mal den Code der Funktion angeschaut. Die Funktion soll den Mittelwert des Übergebenen REAL-Arrays berechnen. Beim Lesen des Codes kam bei mir schon Verwunderung auf, der durch einen kleinen Test bestätigt wurde. Es wird nämlich nur ein Teil des Arrays (SHR(size,2)-1) zur Ermittlung des Wertes herangezogen.
Ein Array (0..9) OF REAL mit folgenden Werten:
fArray[0] := 1;
fArray[1] := 2;
...
fArray[8] := 9;
fArray[9] := 10;

ergibt als Mittelwert somit das Ergebnis = 1,5.   (Es werden in diesem Fall nur die ersten beiden Werte herangezogen --> (1+2) / 2 = 1,5...

Vielleicht habe ich hier irgendwas nicht verstanden aber ich würde da irgendwie schon ein anderes Ergebnis erwarten zumal auch die Anleitung nichts über ein derartiges Verhalten aussagt.....

peewit

#1
hi Belacqua

beispiel:

VAR
   ar6 : ARRAY[0..6] OF REAL := 3,2,4,7,1,6,-2;
   X: REAL;
END_VAR

X := ARRAY_AVG(ADR(ar6),SIZEOF(ar6));

die summe der 7 real zahlen ergibt 21 und geteilt durch 7 ergibt 3, und genau das gibt die Function auch als ergebnis zurück.
Hast du bei size auch die SIZEOF verwendet !


stop := SHR(size,2)-1;
array_avg := pt^[0];
FOR i := 1 TO stop DO
   array_avg := array_avg + pt^;
END_FOR;
array_avg := array_avg / (stop + 1);

Zur Erklärung
stop := SHR(size,2)-1;

ein REAL wert belegt 4 Bytes und 7 Werte ergeben einen size von 28
damit man die Anzahl der Reals im buffer bestimmen kann, wird die buffersize durch 4 dividiert (SHR x,2) und -1 weil mit index 0 begonnen wird.