TIA Werte vom Array automatisch addieren

Am einfachsten über eine Schleife alle Array-Elemente addieren/multiplizieren...

z.B.:
For i := 0 to "Arraylänge" do
Ergebnis := Ergebnis + Arrayelement;
end_for;

Wäre jetzt mein erster Gedanke hierzu
 
Denke du suchst sowas wie das oder?

Code:
addSum := subSum := mulSum := divSum := 0;


FOR i := 1 TO lastIndex DO
    addSum += myArray[i];       // Addieren
    subSum -= myArray[i];       // Subtrahieren
    mulSum *= myArray[i];       // Multiplizieren
    divSum /= myArray[i];       // Dividieren
END_FOR;
 
@jat
das ist nur eine andere Scheibweise, oder?

Bei mul und div kommt aber immer 0.0 raus, sicher weil er als initialwert 0 hat.
wie kann ich das ändern?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@jat
das ist nur eine andere Scheibweise, oder?
Ja, ist nur eine Schreibweise.

Bei mul und div kommt aber immer 0.0 raus, sicher weil er als initialwert 0 hat.
wie kann ich das ändern?

Mein Fehler (früh morgens passiert das mal :ROFLMAO:). Wobei man beim dividieren beachten muss das der Startwert nicht 1 sein sollte.
Lösung:
Code:
[COLOR=#ff0000]addSum := subSum := 0;[/COLOR]
[COLOR=#ff0000]mulSum := 1;
divSum := startValue;[/COLOR]


FOR i := 1 TO lastIndex DO
    addSum += myArray[i];       // Addieren
    subSum -= myArray[i];       // Subtrahieren
    mulSum *= myArray[i];       // Multiplizieren
    divSum /= myArray[i];       // Dividieren
END_FOR;
 
Bei mul und div kommt aber immer 0.0 raus, sicher weil er als initialwert 0 hat.
wie kann ich das ändern?
Du kannst vor der Schleife einfach einen anderen Initialwert festlegen. Aber: Überlege mal, was mulSum und divSum für einen praktischen Zweck haben sollen außer zu zeigen "ich kenne einen neuen Befehl" und "damit lassen sich Aufgaben sehr arbeitsarm programmieren" ... ;)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ist es möglich die Werte in einem Array automatisch zu berechnen, zB zu addieren?
Was stellst Du Dir unter "automatisch" vor? Eine Funktion[alität], die pausenlos das Array durchflöht und auswertet? Auch während sich in dem Array nichts ändert, denn es könnte sich ja doch etwas geändert haben?
Wenn nur Du selbst etwas ins Array schreibst, könntest Du bei jedem Schreiben selbst die z.B. Summe aktualisieren (Element lesen, von der Summe subtrahieren und dann Element schreiben und zur Summe addieren).

PS:
Beim dividieren (wozu überhaupt?) bitte bedenken, was passieren soll, wenn ArrayElement =0 ist!
 
Zuletzt bearbeitet:
Hallo,

ja, multiplizieren und dividieren macht keinen Sinn. Ist ja nur der Vollständigkeit halber.
Für mich kommt es ja nur auf die Addition an. Bisher habe ich alle Werte aus einem struct händisch zusammengerechnet und das wollte ich irgendwie einfacher mit einem array lösen, zumal das Array dann ja auch mal die Größe ändern kann. So im Sinne der Summe() Funktion im Excel.
Es werden eigentlich nur die Zellen zusammengerechnet in denen ein Wert steht. Ich will die Werte schnell in den DB eingeben können, übertragen und fertig.
 
Zuletzt bearbeitet:
Hi, Ich habe ein ähnliches Problem und fange langsam an zu zweifeln, ob es überhaupt möglich ist.
Und zwar habe ich ein Array von 0-30 (wobei ich nur die Werte 1-30 beschreibe) diese Werte ändern sich nun aber zyklisch (jede Sekunde) und ich brauche immer die aktuelle Summe.
Momentan addiert er aber immer alles zusammen und die Summe wird immer größer.
Da ich gerade in der Simulation aber statische Werte benutze, dürfte ja genau DAS nicht passieren.

Hat jmd einen Vorschlag?

edit:
Also mein Problem ist, dass er ja die Werte Schrittweise zusammen rechnet für und nicht einfach eine Summe bildet.
Da das Programm zyklisch aufgerufen wird, rechnet es halt immer wieder den Wert für das aktuelle oben drauf.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich nehme mal an, dass du deine Werte in einer Schleife einliest.
Du musst also deine Summe VOR der Schleife auf 0 setzen
Code:
"Datenbaustein_2".Summe := 0;
FOR #i := 1 TO 30 DO
    "Datenbaustein_2".Summe := "Datenbaustein_2".Summe + "Datenbaustein_2".Wert[#i];
END_FOR;
 
Zuletzt bearbeitet:
Code:
s := 0 ;
for i := 1 to 30 do
    s := s + a[i] ;
end_for ;
Edit:
Also mein Problem ist, dass er ja die Werte Schrittweise zusammen rechnet für und nicht einfach eine Summe bildet.
Da das Programm zyklisch aufgerufen wird, rechnet es halt immer wieder den Wert für das aktuelle oben drauf.

Heisst das, Du hast zwar das Problem erkannt, aber es fällt Dir nichts ein, was Du dagegen tun könntest?
Was ist "oben drauf"? Wo oben drauf? Auf eines oder mehrere der FeldElemente?
 
Zuletzt bearbeitet:
Das funktioniert so leider nicht., weil, wie gesagt, die Summe dann immer größer wird.
also nach 30 sekunden habe ich die Werte im Array voll um die Summe daraus zu bilden, dann addiert er aber ; nach deinem Code, jede Sekunde einfach einen neuen Wert dazu, anstatt weiterhin einfach die Summe des Arrays zu bilden.

So weit war ich schon, UND, keine Sorge ich setzte die Summe in den ersten 30 sek auf null.
 
Ich hab auch schon versucht

if i >1 and <=30 then

sum := sum + value - value[i-1]

elsif i=1 then

sum := sum + value - value[30]

end_if;


edit:
also, nachdem er mir den Speicher einmal mit 30 Werten voll gemacht und die Summe daraus gebildet hat.
 
Du verschweigst uns doch irgendwas?
Woher nimmst Du das 'i'?
Hast Du Zugriff auf die Programmstelle, die Dir das Array mit Werten auffüllt und willst Du dort die Summe bilden?
Oder bekommst Du das gefüllte Array "vorgesetzt" und musst Du dann die Summe bilden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also, ich lasse einen timer laufen und den Baustein alle 1000ms aurufen.
wenn der Timer >30 ist, zählt mir das i hoch, wenn das i >30 ist, setzt er es wieder auf 1.

die ersten 30 sek passiert nichts, dann füllt er 30 sekunden lang mein array mit "werten" und soll dann daraus eine summe bilden.
ab jetzt t=60 sek kommt jede sekunde ein neuer "wert" dazu, aber die Summe soll immer aus den aktuellen 30 werten gebildet werden.
Versteht man das so besser?

ich bin gerade so verzweifelt, dass ich alle einzelnen werte des arrays händisch pro zyklus addiere, das kanns doch aber nicht sein :(
 
ich bin gerade so verzweifelt, dass ich alle einzelnen werte des arrays händisch pro zyklus addiere, das kanns doch aber nicht sein :(
Nimm Deine gesammelte Verzweiflung und schliess sie in einen Tresor ein - dann können wir in Ruhe überlegen . . .
Gibt es einen geeigneten Zeitpunkt, zu dem Du die Summe bilden sollst?
Die dann aktuellen Inhalte der FeldElemente sollen aufaddiert werden?
Oder ist da inzwischen von anderer Seite etwas auf die Feldelemente draufaddiert worden, was Du nun zuerst wieder herausrechnen musst?
 
Mach es genauso wie ich und heinilein das geschrieben haben (code).
dieses stückchen code permanent aufrufen (der einfachheit halber erstmal). z.b. ob1.
dann hast du die summe aller werte die sich im db befinden. permanent. also während des füllens wird sich die summe ändern.

willst du das nur 1 mal machen wenn der db gefüllt wurde dann z.b. so
Code:
if array_voll and not flankenspeicher then
  flankenspeicher := true;
  "Datenbaustein_2".Summe := 0;
  FOR #i := 1 TO 30 DO
    "Datenbaustein_2".Summe := "Datenbaustein_2".Summe + "Datenbaustein_2".Wert[#i];
  END_FOR;
end_if;

in deinem stückchen code fehlt
sum := 0;
 
Zurück
Oben