Array BubbleSort plötzlich andere Ausgabe
-
Moin allerseits
HIER CODE:
#include <iostream>
// Code gives all corresponding Octaves in Hz from a given Frequency Input F.
// Frequencies no order & calcsizeint main () {
// Wahl-Frequenz
float F_1 = 432;
float F_2 = 432;
// Zähler
unsigned int counter = 0;
//
//
//
F_1 = 432; // Hz // Root
//
//
//
std::cout << F_1 << '\n';
++counter;
// Container, Array, Feld wie auch immer.. dessen Anzahl Elemente mit counter mitzählt
float A[counter];
A[0] = F_1;
// Sub Octaves down to near 30 Hz und Läufer q 1 da A[0] besetzt
unsigned int q = 1;
while (F_1 > 30) {
std::cout << F_1 / 2 << '\n';
F_1 = F_1 / 2;
++counter;
A[q] = F_1;
++q;
}
// Over Octaves up to nearly 22'000 Hz
while (F_2 < 22000) {
std::cout << F_2 * 2 << '\n';
F_2 = F_2 * 2;
++counter;
A[q] = F_2;
++q;
}
for (unsigned int i = 0; i < counter; ++i) {
for (unsigned int j = counter-1; j > i; --j) {
if ( A[j] < A[j-1] ) {
float tmp = A[j];
A[j] = A[j-1];
A[j-1] = tmp;
}
}
}
std::cout << '\n';
// Output sortet Array
for (unsigned int l = 0; l < counter; ++l)
std::cout << A[l] << '\n';
return 0;
}HIER OUTPUT:
[Running] cd "/var/folders/hj/dx8fv_v94t58qbtkvbtk0j0w0000gn/T/" && g++ tempCodeRunnerFile.cpp -o tempCodeRunnerFile && "/var/folders/hj/dx8fv_v94t58qbtkvbtk0j0w0000gn/T/"tempCodeRunnerFile
432
216
108
54
27
864
1728
3456
6912
13824
2764827
54
108
216
432
864
1728
3456
-5.51184e-26
4.59163e-41
-5.51184e-26[Done] exited with code=0 in 0.996 seconds
HIER FRAGE:
Warum gibt es mir nach dem BubbleSort und aber nur die letzten drei Zahlen in dieser komischen Form aus?
Und was bedeuten diese? Sind das die Adressen oder eine andere Schreibweise für ein und die selbe Zahl?Liebe Grüsse K
-
@gudi sagte in Array BubbleSort plötzlich andere Ausgabe:
float A[counter];
Das ist kein gültiges C++, da counter nicht konstant ist.
Selbst wenn man hier wirklich VLAs verwenden will, wird dieses Array mit der Größe 1 angelegt. Alles was folgt ist undefiniertes Verhalten.
Benutze std::vector und std::sort.
-
Wenn du ein neues Thema anfängst, siehst du unter anderen folgenden Text:
Formatiere Deinen Code! Verwende dazu den Code-Knopf:
Beherzige das.
-
Über Vector läuft es einwandfrei. Wie gesgat hätte mich die BEgründung für en plötzlichen sprung zu einer anderen Notation in mitten dem Schleifendurchlauf interessiert.
Das mit der constant verstehe ich daran hab ich nicht gedacht, aber das Programm compiliert ja trotzdem.
Was repräsentieren die schreibweisen?
-5.51184e-26
4.59163e-41
-5.51184e-26
-
@gudi sagte in Array BubbleSort plötzlich andere Ausgabe:
mich die BEgründung
Undefiniertes Verhalten. Du manschst im Speicher rum und machst das Programm kaputt.
-5.51184e-26 ist die Exponentialschreibweise für eine sehr kleine Zahl.
-
@gudi sagte in Array BubbleSort plötzlich andere Ausgabe:
Das mit der constant verstehe ich daran hab ich nicht gedacht, aber das Programm compiliert ja trotzdem.
Kompiliere mit
-Wall -Wextra -Wpedantic -Werror
und schon kompiliert es nicht mehr (das ist ein genereller Rat, hier relevant ist das -Wpedantic im Kombination mit -Werror)
-
@gudi sagte in Array BubbleSort plötzlich andere Ausgabe:
aber das Programm compiliert ja trotzdem
Nicht mit allen Compilern, nicht mit g++ -Wall -Wextra -pedantic -std=c++17 (oder welche konkrete Version auch immer):
g++ -Wall -Wextra -pedantic -std=c++17 muell.cpp -o muell muell.cpp: In Funktion »int main()«: muell.cpp:22:7: Warnung: ISO-C++ verbietet Array »A« variabler Länge [-Wvla] 22 | float A[counter]; | ^
oder
g++ -Wall -Wextra -pedantic-errors -std=c++17 muell.cpp -o muell muell.cpp: In Funktion »int main()«: muell.cpp:22:7: Fehler: ISO-C++ verbietet Array »A« variabler Länge [-Wvla] 22 | float A[counter]; | ^
Arraygrenzen werden in C++ nicht geprüft. Auch nicht bei std::vector mit []. Benutze std::vector mit at(), dann meldet sich das Programm bei einem falschen Index
-
@manni66 Oooohh jetzt geht ein Lämpchen auf Gut erklärt Danke und verstanden