Autor Beitrag
neisael
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 03.05.10 07:34 
Hallo,

folgendes:

Ich habe mir einen Timer gebastelt der mir den Strom inm 1/1000 sekunden bereich anzeigt.
Nun schwankt dieser wert sehr stark so dass ich mir gern jeweils 10 werte am stück herauspicken und davon den mittelwert bilden möchte.

so sieht das etwa aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
private void updateTimer_Tick(object sender, EventArgs e) {
            updateData();

            //Stromdaten am Motor

            umc.umc_GetCurrent(g_controllerNr, 0out value0, out age);
            current0 = value0.ToString();

}


nur wie kann ich das jetzt am geschicktesten machen ohne schlaufe? oder sonst wie? mir fällt leider nichts ein.

gruß und danke


Zuletzt bearbeitet von neisael am Mo 03.05.10 08:03, insgesamt 1-mal bearbeitet
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 03.05.10 07:42 
Hallo und :welcome:,

ohne Schlaufe? Meinst du damit eine Schleife?

Weil eigentlich würde ich dir genau dazu raten. Mach eine eigene Methode um den Wert auszulesen und gib ihr als Parameter die Anzahl an Messungen mit.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public double GetMean(int g_controllerNr, int musstDuWissen, int readings)
{
   double sum, value, age;
   for (int i = 0; i < readings; i++)
   {
      updateData();
      umc.umc_GetCurrent(controllerNr, musstDuWissen, out value, out age);
      sum += value;
   }

   return sum / readings;
}


Gruß

PS: Bitte markiere hier im Forum Code als solchen. Das kannst mit den cs-Tags ([cs]Code[/cs ]) machen oder über Bereiche, C#, markieren und + drücken. Deinen Beitrag kannst du mit klick auf das Scherensymbol auch noch im Nachhinein bearbeiten.
neisael Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 03.05.10 08:39 
Hey danke für die schnelle antwort.

hab das jetzt mal so umgebaut das es passt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
public double GetMean(int readings)
        {
            readings = 10;
            int sum, value;
            uint age;
            for (int i = 0; i < readings; i++)
            {
                updateData();
                umc.umc_GetCurrent(g_controllerNr, 0out value, out age);

                sum += value;
            }

            return sum / readings;
        }


aber er sagt mir jetzt noch:

Fehler 1 Verwendung der nicht zugewiesenen lokalen Variablen "sum"

0 steht für den Axen Motor, also den ersten sozusagen. Und das macht er dann wirklich für jeden Timer_Tick? Und += heisst das er alles aufsummiert? Wie wahrscheinlich festzustellen ist bin ich doch noch starker anfänger und hoffe auf etwas Nachsicht.

Und ja meinte natürlich eine Schleife.

Gruß
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 03.05.10 08:44 
Hallo und noch :welcome:

Die Fehlermeldung sagt schon alles:
user profile iconneisael hat folgendes geschrieben Zum zitierten Posting springen:
Fehler 1 Verwendung der nicht zugewiesenen lokalen Variablen "sum"

Unter C# muss eine Variable ausdrücklich initialisiert werden, bevor sie benutzt werden kann. Weiter unten addierst du einen Wert dazu; damit das möglich ist, muss die Variable mit einem Anfangswert versehen werden. Das geschieht in diesem Fall am besten gleich bei der Deklaration.

Gruß Jürgen
neisael Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 03.05.10 10:01 
danke:) nun ist auch dieses problem gelöst.

dafür gibt es ein weiteres. wenn das nun für zB 10 werte läuft, istd as kein problem. bei 20 werten (pro tausendstel sekunder die ein timer_tick hat) beginnt mein programm an zu stocken(wohl ziemliche viele werte)
was kann ich da dagegen noch machen? ausser die werte bei 10 zu belassen oder das tiemr intervall herab zu setzen?

danke
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 03.05.10 10:07 
Ich vermute nichts. "Deine" updateData wird wohl kaum Optimierungspotenzial haben.

Das ist wohl einfach zuuu schnell... auch scheint es mir dann so, dass du mit Synchronisierung aufpassen musst, bzw. abfangen.

Ich denke die eine Schleife ließt noch werte aus, während die nächste bereits eine neue Schleife beginnt... Das kann nicht gut gehen bzw. sinnvoll sein.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 03.05.10 10:07 
Das ist unter Windows so nicht möglich. Bis zu 20 oder 30 msec Timer-Intervall ist Windows noch arbeitsfähig; alle kürzeren Intervalle führen zu "Pi-mal-Daumen". Einige Anmerkungen siehe z.B. unter Timer zu langsam; dort habe ich per Forumssuche noch andere Beiträge zum Thema "Timer Echtzeit" gefunden.

Jürgen


Zuletzt bearbeitet von JüTho am Mo 03.05.10 10:28, insgesamt 1-mal bearbeitet
neisael Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 03.05.10 10:25 
ok dann bedanke ich mich vielmals für eure hilfe, werde sie sicher noch öfters benötigen.

bis dann