Maximale Operationszahl einer For-Schleife erhöhen.



  • Hey, ich bin noch recht frisch in Cpp und programmiere deswegen alles Mögliche um meine Kentnisse zu erweitern. Momentan versuche ich eine art Brute-Force Programm mit einer for Schleife und darin verschachtelten if Anweisungen zu programmieren. Das Programm an sich funktioniert schon und ich lass alle Kombinationsmöglichkeiten über einen Array ausgeben. Das Problem ist jetzt, dass ich ungefähr 3,6 Millionen Kombinationen erreichen möchte, das Programm aber beim Start sofort abstürzt, wenn ich dem Array so viele Plätze zuweise. Also ich nehm mal an, dass es einfach an einer begrenzten Rechenleistung liegt oder so, aber ich kenn mich halt zu wenig aus und wollte deswegen fragen, ob mir jemand bestätigen kann, dass die Anzahl zu übertrieben ist oder es einfach an irgend einen Formfehler (z.B. max Arraygröße) liegt.
    Und falls es Ideen außer "kauf dir nen besseren Rechner" gibt, wäre ich auch sehr dankbar ^^

    (PS: ich weiß, dass bei solchen Themen gerne mal hacking vorwürfe kommen und kann deswegen nur sagen, dass ich weder über die kompetenzen noch den willen verfüge irgendsowas zu machen)



  • Der Stack hat standardmäßig eine begrenzte Größe. Wenn Dein Array die überschreitet, stürzt Dein Programm ab.
    Warum benutzt Du überhaupt ein Array?
    In CPP gibt es dafür std::vector oder aber auch std::array 😕



  • Jaaa ich bin halt noch wirklich bei den Basics und mich mit Vektoren noch nicht so sehr beschäftigt ^^" Werd mir das dann mal angucken aber das Stackproblem wird wohl auch dort bleiben oder? Kann ich den vielleicht irgendwie alle 100 Kombinationen "säubern" damit Platz für neue Operationen automatisch frei wird?



  • Nö, mit den STL-Containern hast Du das Problem nicht, weil die sich den benötigten Speicher vom Heap holen.



  • Ah ok dann werd ich wohl mehr lernen müssen. Vielen Dank für die schnelle Hilfe!



  • std::array hilft nicht beim Größenproblem des Stacks.

    Nimm std::vector , wenn du die Größe ändern können willst oder wenn du nicht groß nachdenken willst oder ...

    Wenn die Größe fest auf den Wert N gesetzt weden soll, kannst auch alternativ auto array_im_freispeicher = std::make_unique<T[]>(N); nutzen.


  • Mod

    Ich frage mich, wieso du überhaupt meinst, die Kombinationen speichern zu müssen. Verarbeite sie doch sofort!



  • wob schrieb:

    std::array hilft nicht beim Größenproblem des Stacks.

    Hussa ... ich habs noch nie genutzt und eine falsche Spekulation rausgehauen ... Asche auf mein Haupt 🙄



  • Also mit dem Vektor klappt es an sich wunderbar, nur stürzt er jetzt bei der 250.000 von 4 Millionen Kombinationen ab. Liegt das daran, dass dann auch die Heap voll ist?

    (Ich will die auch gar nicht speichern, aber weiß halt grad nicht wie ich die nach erstellen wieder lösche :P)


  • Mod

    GustavSchnabel schrieb:

    Also mit dem Vektor klappt es an sich wunderbar, nur stürzt er jetzt bei der 250.000 von 4 Millionen Kombinationen ab. Liegt das daran, dass dann auch die Heap voll ist?

    Unwahrscheinlich. Viel wahrscheinlicher machst du einen Fehler.

    (Ich will die auch gar nicht speichern, aber weiß halt grad nicht wie ich die nach erstellen wieder lösche :P)

    Häh? Indem du sie einfach gar nicht speicherst! Das gibt es nichts zu löschen.

    Das klingt alles sehr verdächtig, als würdest du irgendetwas Grundlegendes ganz furchtbar falsch machen. Zeig mal Code!



  • #include <fstream>
    #include <iostream>
    #include <strings.h>
    #include <vector>
    using namespace std;
    int main(void) {
        string Woerterliste[207800];
        vector<string> WortVec;
        vector<string> Kombi;
        ifstream file("Wortliste.txt");
        if (file.is_open()) {
            for (int v = 0; v < 207500; ++v) {
                file >> Woerterliste[v];
                WortVec.push_back(Woerterliste[v]);
                Kombi.push_back("");
            }
        };
        int x;
        char a;
        char b;
        int q = 0;
        int w = 0;
        int e = 0;
        char Auswahl_a[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        char Auswahl_b[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        for (int i = 0; i <= 4000000; ++i) {
            if (e <= 8) {
                ++e;
                b = Auswahl_b[w];
                a = Auswahl_a[e];
                Kombi[i] += WortVec[q];
                Kombi[i] += b;
                Kombi[i] += a;
                cout << "Kombination Nr " << i << " = " << Kombi[i] << endl;
                continue;
            } else if (e > 8 && w <= 8) {
                ++w;
                e = 0;
                b = Auswahl_b[w];
                a = Auswahl_a[e];
                Kombi[i] += WortVec[q];
                Kombi[i] += b;
                Kombi[i] += a;
                cout << "Kombination Nr " << i << " = " << Kombi[i] << endl;
                continue;
            } else if (w > 8 && q < 207800) {
                ++q;
                e = 0;
                w = 0;
                b = Auswahl_b[w];
                a = Auswahl_a[e];
                Kombi[i] += WortVec[q];
                Kombi[i] += b;
                Kombi[i] += a;
                cout << "Kombination Nr " << i << " = " << Kombi[i] << endl;
                continue;
            } else {
                x = i;
                break;
            }
        };
        cout << "|ES WURDEN " << x << " KOMBINATIONEN GETESTET|";
        cin.sync();
        cin.get();
        return 0;
    }
    

    Also jede Kombination soll ein Wort aus einer Wortliste (Wortliste.txt) enthalten und dieses mit einer 2 stelligen Zahl versehen.

    Mod-Edit (camper): Code-tags + clang-format



  • Du schreibst 207500 Einträge in deinen Vektor, versuchst aber auf 4.000.000 verschiedene Stellen im Vektor zuzugreifen. Das kann nicht funktionieren.

    Ansonsten bin ich mir nicht ganz sicher, was du mit deinem Code wirklich erreichen möchtest.
    Zum Beispiel scheinst du die 9 für deine Zahlenkombination nicht zu benutzen. Sollen die Zahlen Wort Kombinationen irgendwie aufsteigend sein? Also sowas wie
    Wort1 + alle zahlen von 00 - 99?



  • Verdammt immer diese dummen Fehler! Danke schön 😃
    Jap, jedes Wort wird 100 Mal ausgegeben



  • Gerne!

    Wenn es dir nur ums ausgeben geht, kannst du dir die zweite for Schleife an der Stelle sparen. Benutz doch einfach nachdem du das Wort eingelesen hast, eine Schleife von 0-99 und bastel dir die Kombination zusammen. Wenn die ersten 10 Ziffern immer mit 00, 01 etc. nummeriert sein sollen, musst du das natürlich auch noch entsprechend mit rein nehmen.
    Damit sparst du dir nicht nur eine Schleife sondern auch das Zwischenspeichern in Vektoren.

    Auch in deinem Ansatz kannst du den Vektor Kombi getrost streichen und einfach in deiner Schleife einen String definieren, den du anstelle des Vektors benutzt.

    Außerdem ist es unschöner Stil, mit deinem else{break}. Du kannst dir vorher überlegen wie viele Schleifendurchläufe du genau benötigst.


Log in to reply