Erstellte Tree in meinem c++ Programm hinzufügen.



  • Ich muss ein bestimmtes File (bin Datei) mit einer Specifikation (text Datei) dekodieren und syntaxis prüfen. Dafür brauche ich folgendes:

    1. Specifikation zu lesen und in einem Tree umzuwandeln.
    2. File zu lesen und in einem Tree umzuwandeln.
    3. File-Tree mit Specifikation-Tree zu dekodieren und prüfen.

    Das geht wunderbar. Aber jedesmal dass das Programm läuft, wird den Punkt 1 immerwieder ausgeführt, obwohl die Specifikation immer dieselbe ist. Und auserdem wenn ich mein Programm liefern will, muss ich auch die Specifikation mitliefern.

    Also wie kann ich meine schon erstellte Tree von der Specifikation in meinem C++ Code schpeichern. Kann man so ein Variable-Dump machen? Ich möchte auch verzichtern die Specifikation mitzuliefern.

    ich hoffe meine Frage ist klar.



  • do
    {
      get_tree();//Punkt 1
      do
      {
        get_data();//Punkt 2
        process_data();//Punkt 3
        cout<<"neuen Baum einlesen?"
      } while(tolower(cin.get())!='j')
    } while(!ende);
    

    Solange du mit dem selben Baum arbeiten willst, wiederholt der immer die Schleife (2)-(3), wenn du die Abfrage mit "J" beantwortest, wird die innere Schleife verlassen und das Programm kehrt zu (1) zurück.



  • Zwingt dich doch niemand, den dauernd wieder einzulesen, beimn Programmstart einlesen und halt wo speichern, sodass er für zugänglich ist, dort wo man ihn braucht. Aber bitte keine globalen Variablen, Kommt jetzt drauf an wie dein Code ist. Ohne Quellcode kann man da schlecht was zu sagen.

    Evtl. wäre auch ein Singleton was für dich?



  • Mangels hellseherischer Fähigkeiten, wir dir niemand ohne den entsprechenden Quelltext die frage beantworten können.



  • WOW! Ihr antwortet aber schnell. Dies Forum ist echt cool!

    @CStoll und @Pellaeon: Danke das ist klar, also Punkt 1 läuft nur einmal im Programm. Ich meine was anderes.

    Punkt 1 ist eine sehr komplizierte Aufgabe im Program aber ist immer dieselbe und das Ergebnis auch dasselbe.

    Was ich eingentlich wollte ist diese Aufgabe direkt in Quellkode durch das Ergebnis ersetzen.

    Z.B Dieser Code

    #include <iostream>
    using namespace std;
    main()
    {
    	int i;
    	int a[10];
    
    	// Aufgabe
    	for (i=0;i<10;i++)
    		a[i]=i;
    
    	// Rest des Programms
    	for (i=0;i<10;i++)
    		cout << a[i] <<endl;
    }
    

    durch diesen ersetzen

    #include <iostream>
    using namespace std;
    main()
    {
    	int i;
    
    	// Ergebnis der Aufgabe. Jetzt keine Aufgabe mehr.
    	int a[]={0,1,2,3,4,5,6,7,8,9};
    
    	// Rest des Programms
    	for (i=0;i<10;i++)
    		cout << a[i] <<endl;
    }
    

    Das Problem ist, ich kann nicht einfach alle Daten des Baumes ins Code reinschreiben. Es ist einfach sehr kompliziert, enthält Vectoren und Maps. Ich bräuchte so ein Variable-Dump (wenn es gibt), oder bessere Ideen.

    @provok: ein bischen Quelltext habe ich jetzt 🙂

    Danke!



  • Templates zum Bauen benutzen um so die Arbeit dem Präprozessor zu überlassen



  • Und warum baust du dir deinen Baum nicht ähnlich auf wie das Array im obigen Beispiel?

    (ohne Garantie:)

    struct node {
      char data[10];
      int top,left,right;
    }
    
    struct tree {
      node* data;
      int pos;
      tree(node* ndata):data(ndata),pos(0){}
      //weitere Funktionen zum Navigieren im Baum
    }
    
    static node tree_data[] =
      { {"Wurzel",-1, 1, 2}, // Wurzel - kein Vaterknoten
        {"Knoten", 0, 3, 4}, // innerer Knoten
        {"Ast"   , 0, 5,-1}, // rechter Sohn fehlt
        {"Blatt" , 1,-1,-1}, // Blatt - keine Söhne
        ...
      }
    tree TheTree(tree_data);
    

    Die Knoten enthalten die eigentlichen Daten (kann ein beliebiger Datentyp sein - POD bieten sich an) und Indizes auf Vater(top) und Kinder(left/right) im Datenarray (-1: nicht vorhanden).
    Der Baum enthält einen Pointer auf ein Array von Knoten und hangelt sich dann durch die Struktur durch (Index 0 ist die Wurzel, die Söhne von Knoten i erreichst du mit "data[data[i].left]" bzw. "data[data[i].right]").



  • @CStoll: Das ist schon eine sehr gute Idee. Mein Baum hat aber minimal 10000 Knoten. Ich glaube ich muss diese 10000 Knoten zu Fuss in meinen Code reinschreiben.

    In Perl gibt es so ein "print::Dumper", mit dem ich ein ganzes Hash (Baum) ausdrucken kann und z.B. als Text-Datei spechern und dann von anderem Programm lesen. So hat der Zweite Programm das Hash vom ersten ohne eine nötigen Verarbeitung.

    Kann man sowas in C/C++ machen?



  • Gegeben ist sowas nicht, aber du könntest es dir selber schreiben (Stichwort: Serialisierung).


Anmelden zum Antworten