Probleme mit einem Sortieralgorithmus
-
Folgender Algorithmus soll Zahlen grob sortieren.
1. Die Positiven (x > 0) von den nicht-Positiven (x <= 0) trennen
2. Die Nullen (x == 0) von den Negativen (x < 0) trennenvoid sort(int * first, int * last) { int temp, * a, * b; a = first - 1; b = last; *b = -1; // Begrenzung rechts setzen // 1. Die Positiven (x > 0) von den nicht-Positiven (x <= 0) trennen do { while (*(++a) > 0); if (a != b) { while (--b != a && *b <= 0); temp = *a; *a = *b; *b = temp; } } while (a != b); a--; b = last; // 2. Die Nullen (x == 0) von den Negativen (x < 0) trennen do { while (*(++a) == 0); if (a != b) { while (--b != a && *b < 0); temp = *a; *a = *b; *b = temp; } } while (a != b); } int main() { int v[6+1] = {1, 2, 0, 0, 3, 0}; sort(v, v + 6); return 0; }
Im Debug-Modus arbeitet die Sortierung einwandfrei. Im Release-Modus kracht es in der while-Schleife:
while (*(++a) == 0); // Hier kracht es!
Die while-Schleife arbeitet nur korrekt, wenn die rechte Begrenzung im Array enthalten ist. Allerdings kann ich die Begrenzung von -1 nicht in sort einbauen. *b = -1 scheint im Register oder sonstwo zu stecken in nicht zurück in den RAM geschrieben zu werden.
Was kann ich hier tun, dass der Algorithmus auch als Release Compilat die rechte Begrenzung "akzeptiert", oder ist sonst noch etwas falsch an der Funktion?
Grüsse
-
Hier liegt nichts falsches durch den Compiler vor, dein Programm ist schlichtweg falsch. Im Debugmodus sind anscheinend noch irgendwelche Sicherheitsvorrichtungen vorhanden die dein Programm vorm Absturz retten.
In Zeilen 17 und 32 werden beispielsweise wilde Pointervergleiche gemacht, ich glaube kaum, dass du dies wirklich so meinst.
lastmove ist anscheinend irgendetwas globales, das riecht verdächtig nach Seiteneffekten.
Die Frage warum die Ausgabe 0 und nicht -1 ist, ist einfach: a ist der Anfang des arrays - 1, somit ist a+7 das 6. Element.
Ansonsten kann ich dein Programm wegen ein paar Compilerfehlern nicht selber ausprobieren um den Fehler genauer zu finden. Aber dies ist was mir beim ersten drübergucken (und mit -Wall compilieren
) sofort aufgefallen ist.
edit: Den Output des Compilers will ich dir nicht vorenthalten, da er recht aufschlussreich ist:
test.c:1:21: warning: C++ style comments are not allowed in ISO C90 test.c:1:21: warning: (this will be reported only once per input file) test.c: In function 'sort': test.c:10: warning: implicit declaration of function 'printf_s' test.c:17: warning: ordered comparison of pointer with integer zero test.c:25: error: 'last_move' undeclared (first use in this function) test.c:25: error: (Each undeclared identifier is reported only once test.c:25: error: for each function it appears in.) test.c:32: warning: ordered comparison of pointer with integer zero
-
Die Funktion zum Sortieren war ursprünglich zum Sortieren von C++ Objekten. Beim Vereinfachen sind mir diese 3 Fehler unterlaufen, sorry.
Das Problem ist jetzt trotzdem behoben, da ich das Array etwas grösser dimensionieren muss.