Zählervariable in for schleife auf null setzen

knappenboy

Mitglied
Hallo,

kann man die Zählervariable in einer for schleife auf null setzen? Wenn ja, wie?

C#:
for (i = 0; i <= 5; i++)
            {
                if(i==5)
                   {
                   i=0;
                   }
                 else
                   {
                   Anweisung;
                   }
            }

Hier klappt es leider nicht.
 
Zuletzt bearbeitet von einem Moderator:

sheel

I love Asm
Wenn man den Wert von i nicht wirklich braucht, der Klassiker:
Code:
while(true)
{
    Anweisung;
}
 

vfl_freak

Premium-User
Wobei Du mal beschreiben solltest, was Du eigentich bezwecken willst!

So nebenbei: ich persönlich halte es generell für kritisch, den Wert der Zählvariable innerhalb des Schleifenrumpfs zu verändern!
Irgendwann wird es garantiert zu Problemen kommen ...

Gruß Klaus
 

knappenboy

Mitglied
Hallo,

für mein späteres Programm, welches für die Kinect2 bestimmt ist, möchte ich Schwankungen dieser ausgleichen indem ich die Joints glätte. Sprich ich nehme mir einen Joint raus, speichere diesen in einer Liste und versuche aus der Liste, sobald 30 Elemente vorhanden sind, den Root Mean Square(rms) zu berechnen.

Wenn die 30 Elemente vorhanden sind, dann berechnet man den rms, danach soll das erste Element aus der Liste gelöscht werden und ein neues hinzugefügt. Damit immer 30 Elemente vorhanden sind.

30 Elemente bedeutet ca. 1 Sekunde Verzögerung.

Du hast recht, da ich die Schleifen leider nicht verbunden habe und nicht weiß wie genau ich das mache.

Vom Programm: ()

private void Reader_FrameArrived(object sender, BodyFrameArrivedEventArgs e)
{
bool dataReceived = false;

hier passiert noch einiges;

if (dataReceived)
{
ebenso, passiert hier noch was;

// -------------ab jetzt folgt die Schleife-----------------

// 1. Element wird gelöscht
for (int kk = 29; kk < Rot_unbe.Count; kk++)
{
Rot_unbe.RemoveAt(0);
}

// die nachfolgende Schleife ist schlecht, Programm hängt sich auf

for (int q = 0; q <= Rot_unbe.Count; q++)
{
if (q >= 30)
{
q = 0;
}
else
{
double s += Rot_unbe[q] * Rot_unbe[q];
}
}
double rms = Math.Sqrt(s / (Rot_unbe.Count));
}
}

Mein Gedanke ist, dass die Rot_unbe Liste erst 30 Daten aufnimmt, eh die Schleifen greifen. Jetzt wird für jeden Frame den die Kinect aufnimmt der rms gebildet, danach ein weiteres Element hinzugefügt in die Liste und danach das erste gelöscht, wieder der rms gebildet, usw..
 

vfl_freak

Premium-User
Moin,

zuerst: benutze bitte die Code-Tags, so bekommt man ja Augenkrebs!

So, dann mal davon abgesehen, was du mit "Kinect2", "Joints" und "rms" meinst ...
// die nachfolgende Schleife ist schlecht, Programm hängt sich auf
Code:
for (int q = 0; q <= Rot_unbe.Count; q++)
{
    if (q >= 30)
    {
        q = 0;
    }
    else
    {
        double s += Rot_unbe[q] * Rot_unbe[q];
    }
}
(a) wo kommt der Wert "Rot_unbe.Count" denn her und wie groß ist er zu Beginn der beiden for-Schleifen ??
(b) was soll die erste for-Schleife genau bezwecken?
Sollen vorne solange Elemente gelöscht werden, bis max. 30 Stück drin sind ??
(c) die zweite Schleife ist eine Endlos-Schleife, da du - sobald 'q>=30' ist - die Zählvariable auf '0' setzt (übrigens NICHT auf 'null' wie im Titel; das ist was ganz anderes !!) und wieder von vorne anfängst. Ergo wird die Schleife nicht mehr verlassen !
(d) gesetzt den Fall, Du kommst in der zweiten for-Schleife in den den else-Fall, dann ist hier die Syntax "double s += Rot_unbe[q] * Rot_unbe[q]" ohne hin falsch, da du zum einen in jedem Durchlauf versuchen würdest eine NEUE Variable 's' zu deklarieren! Zudem schlägt grundlegend eine Deklaration und gleichzeitige Konkatenation zwangsläufig beim Compilieren fehl !!
Wenn, dann sowas:
Code:
double s;
for (int q = 0; q <= Rot_unbe.Count; q++)
{
    if (q >= 30)
    {
        q = 0;
    }
    else
    {
        s += Rot_unbe[q] * Rot_unbe[q];
    }
}

Gruß Klaus
 

knappenboy

Mitglied
Wie verwende ich die Code-Tags?

a) ich berechne den Rotationswinkel des Ellenbogengelenks für jeden Frame, der rein kommt und füge den Winkel in die Rot_unbe Liste am Ende an.

b) die Liste soll danach 30 Elemente enthalten, sobald durch einen Frame ein neues Element hinzugefügt wird, soll das erste Element der Liste gelöscht werden, damit die Liste immer 30 Elemente enthält.

c) Was ist der Unterschied zwischen '0' und null? (ich programmiere noch nicht lang, entschuldige das bitte^^)
Wie könnte ich das am besten machen, dass ich die 30 Elemente aus b) nutze um den Root Mean Square zu berechnen, diesen zu speichern und im Fall, wenn ein neuer Frame aufgenommen wird, alles von vorn beginnt.

d) somit schließt c) die else Bedingung von d) mit ein.
Allerdings wird doch in "s" alle Elemente der Liste mit sich selbst quadriert und mit allen anderen aufsummiert, oder?
 

vfl_freak

Premium-User
Wie verwende ich die Code-Tags?
Im Editor gibt es dafür den "Einfügen..."-Button (links von Disketten-Icon) oder [code=Java] ...meinTollerCode... [/code]

(a) ich meinte weniger eine textuelle Beschreibung, sondern den Code, wo "Rot_unbe" deklariert und gefüllt wird!
wie groß ist 'Count' denn nun zu Beginn der ersten for-Schleife ??

(b)
damit die Liste immer 30 Elemente enthält
geht einfacher, bspw.
Code:
while( Rot_unbe.Count > 30 )
{
    Rot_unbe.RemoveAt( 0 );
}

(c)
Was ist der Unterschied zwischen '0' und null?
https://de.wikipedia.org/wiki/Nullwert

(d)
Wie könnte ich das am besten machen, dass ich die 30 Elemente aus b) nutze
wenn sichergestellt ist, dass "Rot_unbe" (BTW: 'sprechendere' Variablennamen wären sinnvoller!!) eben max. 30 Elemente enthält, dann ganz simpel:
Java:
double s;
for( int q = 0; q < Rot_unbe.Count; q++ )
{
    s += Math.pow( Rot_unbe[q], 2 );
}
Wichtig ist es, die Variable 's' VOR der Schleife zu deklarieren!!
Erstens kannst Du sie nur dann danach noch nutzen und , wie oben schon geschrieben, darfst nie gleichzeitig deklarieren und konkatenieren !!

(e)
und im Fall, wenn ein neuer Frame aufgenommen wird, alles von vorn beginnt
Ist mir nicht ganz klar, was Du meinst ...

(f)
Allerdings wird doch in "s" alle Elemente der Liste mit sich selbst quadriert und mit allen anderen aufsummiert, oder?
nicht bei Deinem Code!
Durch 'double s' würde ja bei JEDEM Durchlauf eine neue Variable 's' erzeugt, die nur in diesem einenm Durchlauf und an der Stelle gültig ist!!
Nehmen wir den einfacheren Fall:
Java:
for( int q = 0; q <10; q++ )
{
    double s = Rot_unbe[q];
}
Hierdurch würde 10-mal (also bei jeden Schleifendurchlauf) eine neue Variable 's' deklariert !!
Beim jeweils nächsten Durchlauf ist die zuvor deklarierte Variable nicht mehr gültig!
Stichworte hierbei sind Gültigkeit oder Sichtbarkeit!
https://msdn.microsoft.com/de-de/library/e1s0ezse(v=vs.100).aspx

Puh, jetzt brauche ich erstmal einen Kaffee :cool:
Gruß Klaus
 

knappenboy

Mitglied
Vielen Dank, für deine Antwort. Jetzt klappt es mit der Schleife.

Vielleicht könnt ihr mir noch bei einem anderen Problem helfen. Ich stehe am Anfang mit der Programmierung der Kinect 2.

Von MSDN gibt es viele Hilfen wie man die Gelenke glättet. Ich habe von SDK 2.0 den BodyBasics-WPF (Anhang) gefunden und würde gern die Glättung (
classKinectJointFilter) von diesem Link:

https://social.msdn.microsoft.com/F...-in-kinectjointfilter-class?forum=kinectv2sdk

mit einbauen. Nur wie?
 

Anhänge

  • BodyBasics-WPF.zip
    26,2 KB · Aufrufe: 8

Neue Beiträge