Heapsort Funktion überspringt For-Schleife

Hi, ich bin eigentlich recht geübt mit dem Arduino, habe jedoch ein Problem, das ich mir nicht erklären kann, nicht mal mein IV Lehrer kann da helfen. Bei meinem Sketch für einen Heapsort Algorithmus, wird bei mir die erste For-Schleife nicht ausgeführt, sondern schlicht übersprungen. Ich weiß nicht warum und kann auch keinen Fehler in meiner Schreibweise entdecken, würde mich um Hilfe freuen.

Hier einmal mein Code:

void setup() {
Serial.begin(9600);
Serial.setTimeout(10000000);
Serial.println("Wie viele Werte sollen sortiert werden?");
}

void loop() {
if (Serial.available()) {
int array_length = Serial.parseInt();
unsigned long PLZ [array_length];
Serial.print("Sie möchten ");
Serial.print(array_length);
Serial.println(" Werte sortieren.");
Serial.println("Bitte geben Sie die zu sortierenden Werte nacheinander ein!");
Serial.print("Unsortiert: ");
for (int i = 0; i < array_length; i++) {
if (Serial.available()) {
PLZ [i] = Serial.parseInt();
Serial.print(PLZ[i]);
Serial.print(", ");
}
}
heapSort(PLZ, array_length);
Serial.println("");
Serial.print("Sortiert: ");
for (int r = 0; r < array_length; r++) {
Serial.print(PLZ[r]);
Serial.print(", ");
Serial.print(" ");
}
Serial.println("");
}
}

void heapSort (unsigned long PLZ[ ], int array_length) {
for (int q = array_length - 1; q == 0; q--) {
for (int k = q; k > 0; k--) {
if (k % 2 == 0) {
if (PLZ[k] > PLZ[k / 2 - 1]) {
unsigned long change;
change = PLZ[k];
PLZ[k] = PLZ[k / 2 - 1];
PLZ[k / 2 - 1] = change;
}
}
else if (k % 2 != 0) {
if (PLZ[k] > PLZ[k / 2]) {
unsigned long change;
change = PLZ[k];
PLZ[k] = PLZ[k / 2];
PLZ[k / 2] = change;
}
}
if (k == 1) {
unsigned long change;
change = PLZ[0];
PLZ[0] = PLZ[array_length - 1];
PLZ[array_length - 1] = change;
}
}
}
}

wenn das so wäre, dann würde ich mir als erstes mal die Werte q und array_length auf der Seriellen ausgeben lassen und erforschen warum sie so sind wie sie sind.
So nebenbei vieleicht auch mal versuchen das unsortierte Array aus loop in der Funktion auszugeben...

Fehler in der Schreibweise? definitiv, lies im Forum how to nach wie man Code Tags setzt, damit man deinen Code auch lesen kann.

Abwählen. Sofort.

Code formatieren sollte er als erstes beigebracht haben.
Hat er nicht?
Wirklich nicht?

Aber wenn:
Dann siehst Du ggffls. auch das Problem. Ab Zeile 19

void setup()
{
  Serial.begin(9600);
  Serial.setTimeout(10000000);
  Serial.println("Wie viele Werte sollen sortiert werden?");
}

void loop()
{
  if (Serial.available())
  {
    int array_length = Serial.parseInt();
    unsigned long PLZ [array_length];
    Serial.print("Sie möchten ");
    Serial.print(array_length);
    Serial.println(" Werte sortieren.");
    Serial.println("Bitte geben Sie die zu sortierenden Werte nacheinander ein!");
    Serial.print("Unsortiert: ");
    for (int i = 0; i < array_length; i++)
    {
      if (Serial.available())
      {
        PLZ [i] = Serial.parseInt();
        Serial.print(PLZ[i]);
        Serial.print(", ");
      }
    }
    heapSort(PLZ, array_length);
    Serial.println("");
    Serial.print("Sortiert: ");
    for (int r = 0; r < array_length; r++)
    {
      Serial.print(PLZ[r]);
      Serial.print(", ");
      Serial.print(" ");
    }
    Serial.println("");
  }
}

void heapSort (unsigned long PLZ, int array_length)
{
  for (int q = array_length - 1; q == 0; q--)
  {
    for (int k = q; k > 0; k--)
    {
      if (k % 2 == 0)
      {
        if (PLZ[k] > PLZ[k / 2 - 1])
        {
          unsigned long change;
          change = PLZ[k];
          PLZ[k] = PLZ[k / 2 - 1];
          PLZ[k / 2 - 1] = change;
        }
      }
      else if (k % 2 != 0)
      {
        if (PLZ[k] > PLZ[k / 2])
        {
          unsigned long change;
          change = PLZ[k];
          PLZ[k] = PLZ[k / 2];
          PLZ[k / 2] = change;
        }
      }
      if (k == 1)
      {
        unsigned long change;
        change = PLZ[0];
        PLZ[0] = PLZ[array_length - 1];
        PLZ[array_length - 1] = change;
      }
    }
  }
}
for (int q = array_length - 1; q == 0; q--)

q == 0 ? Wie funktionieren for-Schleifen nochmal?

if (k % 2 == 0)
{
}
else if (k % 2 != 0)
{
}
if (k == 1)

Das passt nicht unbedingt. 1 % 2 ist 1 und daher ebenfalls ungleich 0.

Übrigens ist eine Modulo-Division eine recht teure Operation. Wenn du weißt dass k nicht 1 ist und gerade ist, dann muss man nicht nochmal eine Division machen um zu wissen dass es ungerade ist.

Was bitte ist IV in dem Kontext?

Invaliden Versicherung? Intra venös?

Seid mir Texte zu einer SpritzgussVorm vorlagen, sehe ich das aus einer etwas gelasseneren Sicht.
Das ist auch ein Ergebnis, wenn eine Rechtschreibschwäche auf "Lernen nach Lautsprache" trifft.
Zum Glück hört letzteres auf.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.