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 & calcsize

    int 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
    27648

    27
    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 🐕 😃


Anmelden zum Antworten